我一直在以一个简单的形式出现此错误:
我在new.html.erb中创建了一个表单:
<%= form_for @party do |f| %>
<%= f.label :title %>
<%= f.text_field :title %>
<%= f.submit "Save" %>
<% end %>
这是我的控制器:
class PartiesController < ApplicationController
def show
@party = Party.find(params[:id])
end
def new
@party = Party.new
end
def create
@party = Party.new(params.require(:title))
if @party.save
flash[:notice] = "Party was saved"
redirect_to @party
else
flash[:error] = "There was an error"
render :new
end
end
end
我不明白为什么在我的表单中有一个标题字段时会出现错误,即使在我的错误屏幕中它也被列为我的一个参数。
答案 0 :(得分:1)
你的params是哈希(或者是Hash的扩展版本),格式为:
{
'party' => {
'title' => 'your value'
}
}
现在当您在这样的“哈希”上调用require(:key)
时,它将检查它是否包含这样的键(并且该值不为空)。但是,您的params
哈希只包含单个密钥'party'
,因此您收到错误消息。 require
方法返回与所需密钥对应的值,因此您可以调用permit
方法,该方法将给定密钥标记为可接受且安全。
所以最后你的电话应该是:
params.require(:party).permit(:title)
注意:params
实际上不是哈希,它是ActionController::Parameters
的实例 - 这就是为什么它不关心你是否使用符号或字符串来指定密钥。
如其他答案中所述,最好将这些表达式包装在私有方法中,因为创建和更新操作通常会这样做。
答案 1 :(得分:0)
party_params
中的PartiesController
行动需要像这样:
def party_params
params.require(:party).permit(:title)
end
然后将您的create
操作更改为:
def create
@party = Party.new(party_params)
...
end
答案 2 :(得分:0)
在create
def create
@party = Party.new params.require(:party).permit(:title)
end
另外,您可以将params.require ...放在私有方法上
private
def party_params
params.require(:party).permit(:title)
end
现在,您可以在任何需要它们的地方使用派对参数。例如:
@party = Party.new party_params
or
@party.update party_params