méthode non définie « permis » pour « Soumettre maintenant !":Chaîne.Où est-ce que je me trompe ?

StackOverflow https://stackoverflow.com//questions/23034953

Question

J'ai essayé comme un fou de surmonter ça permit erreur en utilisant certaines des autres publications de StackOverflow, mais je n'arrive pas à la surmonter.J'ai un modèle et un contrôleur de projets et un modèle et un contrôleur de versions. Projects/##/versions/new est une page de formulaire pour créer une nouvelle version de l'identifiant du projet ##.Mais lorsque je clique sur le bouton Soumettre pour créer la version... cela génère l'erreur suivante dans le VersionsController:

undefined method `permit' for "Submit Now! ":String

Extracted source (around line #36):
34
35
36
37
38


    def version_params
      params.require(:version).permit(:title)
    end
end

Toute aide serait grandement appréciée... J'essaie de résoudre ce problème depuis trop longtemps maintenant.Mon code est le suivant :

ROUTES.RB

resources :users
  resources :sessions, only: [:new, :create, :destroy]
  resources :projects, only: [:create, :new, :show, :edit, :update, :destroy]

  resources :projects do
    resources :versions
  end

  # get "static_pages/home"
  # get "static_pages/help"
  # get "static_pages/about"
  #The original routes above map to...
  root  'static_pages#home'
  match '/signup',  to: 'users#new',            via: 'get'
  match '/signin',  to: 'sessions#new',         via: 'get'
  match '/signout', to: 'sessions#destroy',     via: 'delete'
  match '/help',    to: 'static_pages#help',    via: 'get'
  match '/about',   to: 'static_pages#about',   via: 'get'
  match '/contact', to: 'static_pages#contact', via: 'get'

MODÈLE DE PROJETS :

class Project < ActiveRecord::Base
  has_many :users
  has_many :versions, dependent: :destroy
  validates :title, presence: true, length: { maximum: 100 }
  validates :background, presence: true
  validates :user_id, presence: true

  default_scope -> { order('created_at DESC') }
end

MODÈLE DE VERSIONS :

class Version < ActiveRecord::Base
  belongs_to :project
  validates :title, presence: true, length: { maximum: 140 }

  default_scope -> { order('created_at DESC') }
end

CONTRÔLEUR DE VERSIONS :

class VersionsController < ApplicationController
  def new
    @version = Version.new
  end

  def show
    @project = Project.find(params[:project_id])
    @version = Version.find(params[:id])
  end

  def index
    @versions = Version.paginate(page: params[:page])
  end

  def create
    @project = Project.find(params[:project_id])
    @version = @project.versions.create(version_params)
    if @version.save
      flash[:success] = "You've successfully added a version to this branch..."
      redirect_to project_path(@project)
    else
      render 'new'
    end
  end

  def edit

  end

  def update

  end

  def destroy

  end

  private

    def version_params
      params.require(:version).permit(:title)
    end
end

NEW.HTML.ERB (formulaire nouvelle version) :

<% provide(:title, 'New Version') %>
<h1>Add a version to this project</h1>

<div class="row-fluid">
  <div class="col-md-5 no-pad offset3">
    <%= bootstrap_form_for @version, :url => project_versions_path do |f| %>

      <%= render 'shared/error_messages', object: f.object %>

      <%= f.text_field :title %>

      <br clear="all">

      <%= f.submit "Submit Now! ", class: "btn btn-lg btn-primary" %>
    <% end %>
  </div>
</div>

PARAMÈTRES :

{"utf8"=>"✓",
 "authenticity_token"=>"######AAAA",
 "submit"=>"Submit Now! ",
 "project_id"=>"51"}

Processing by VersionsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"################=", "version"=>"Submit Now! ", "project_id"=>"51"}
  Project Load (0.3ms)  SELECT "projects".* FROM "projects" WHERE "projects"."id" = ? ORDER BY created_at DESC LIMIT 1  [["id", "51"]]
Completed 500 Internal Server Error in 3ms

NoMethodError (undefined method `permit' for "Submit Now! ":String):
  app/controllers/versions_controller.rb:41:in `version_params'
  app/controllers/versions_controller.rb:17:in `create'
Était-ce utile?

La solution

Je peux reconnaître le problème dans les paramètres.Tu as ceci:

{"utf8"=>"✓",
 "authenticity_token"=>"######AAAA",
 "submit"=>"Submit Now! ",
 "project_id"=>"51"}

Vous devriez avoir ceci :

{"utf8"=>"✓",
 "authenticity_token"=>"######AAAA",
 "project_id"=>"51",
 "version"=>{"title"=>"Foo Bar"},
"button"=>""}

La raison pour laquelle il s'agit d'un problème est que vous n'avez pas de titre de version transmis dans les paramètres et que vous essayez de créer une nouvelle version avec les paramètres.À la place, il recherche la chose la plus proche qui, dans ce cas, est la chaîne "Soumettre maintenant!", mais comme "soumettre" n'est pas autorisé, des paramètres forts la rejettent.

Il semble que vous créez correctement votre formulaire, cela peut être un problème avec bootstrap_form_for.Pouvez-vous publier à quoi ressemble la sortie d'entrée du titre en HTML sur votre formulaire ?

En attendant, j'ai deux suggestions, la première chose qui peut résoudre le problème, c'est de changer f.soumettre à f.bouton.f.button créera toujours un bouton de soumission, mais il vous permettra de le nommer comme vous essayez de le faire.

Également dans le contrôleur, vous n'avez pas besoin de sauvegarder après avoir appelé create.create le stockera en fait dans la base de données, vous l'enregistrerez donc deux fois.Vous devriez soit appeler new au lieu de créer

@version = @project.versions.new(version_params)
if @version.save

de vérifier si nouvel enregistrement

@version = @project.versions.create(version_params)
unless @version.new_record?
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top