当我将参数输入表单字段时,为什么我缺少参数

时间:2015-04-02 19:41:43

标签: ruby-on-rails ruby

我一直在以一个简单的形式出现此错误:

enter image description here

我在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

我不明白为什么在我的表单中有一个标题字段时会出现错误,即使在我的错误屏幕中它也被列为我的一个参数。

enter image description here

3 个答案:

答案 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