método indefinido `permit' para “Enviar agora!":Corda.Onde eu estou errando?
-
21-12-2019 - |
Pergunta
Eu tenho tentado como um louco resolver isso permit
erro ao usar algumas das outras postagens do StackOverflow, mas parece que não consigo superá-lo.Eu tenho um modelo e controlador de projetos e um modelo e controlador de versões. Projects/##/versions/new
é uma página de formulário para criar uma nova versão do ID do projeto ##.Mas quando clico no botão enviar para criar a versão... ocorre o seguinte erro no 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
Toda e qualquer ajuda seria muito apreciada... Estou tentando consertar isso há muito tempo.Meu código é o seguinte:
ROTAS.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'
MODELO DE PROJETOS:
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
MODELO DE VERSÕES:
class Version < ActiveRecord::Base
belongs_to :project
validates :title, presence: true, length: { maximum: 140 }
default_scope -> { order('created_at DESC') }
end
CONTROLADOR DE VERSÕES:
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 (formato de nova versão):
<% 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>
PARÂMETROS:
{"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'
Solução
Posso reconhecer o problema nos parâmetros.Você tem isto:
{"utf8"=>"✓",
"authenticity_token"=>"######AAAA",
"submit"=>"Submit Now! ",
"project_id"=>"51"}
Você deveria ter isto:
{"utf8"=>"✓",
"authenticity_token"=>"######AAAA",
"project_id"=>"51",
"version"=>{"title"=>"Foo Bar"},
"button"=>""}
A razão pela qual isso é um problema é porque você não tem um título de versão sendo passado nos parâmetros e está tentando criar uma nova versão com os parâmetros.Em vez disso, ele procura a coisa mais próxima que, neste caso, é a string "Enviar agora!", mas como "enviar" não é permitido, parâmetros fortes o descartam.
Parece que você está criando seu formulário corretamente, pode ser um problema com bootstrap_form_for.Você pode postar como é a saída de entrada do título em HTML no seu formulário?
Enquanto isso, tenho duas sugestões, a primeira coisa que pode resolver o problema é mudar f.enviar para botão f..f.button ainda criará um botão de envio, mas permitirá que você nomeie da maneira que você está tentando.
Também no controlador, você não precisa salvar depois de chamar create.create irá, na verdade, armazená-lo no banco de dados, então você o salvará duas vezes.Você deve chamar new em vez de create
@version = @project.versions.new(version_params)
if @version.save
de verificar se há novo registro
@version = @project.versions.create(version_params)
unless @version.new_record?