【问题标题】:Params is nil even though log shows passing即使日志显示通过,参数也为零
【发布时间】:2014-08-09 11:30:00
【问题描述】:

Rails 调试器显示的参数

{"utf8"=>"✓",
  "authenticity_token"=>"m2NMruoFRr6lpsuVMK9UthlY0bsJsPmf1LWce2uKaH4=",
  "signup_id"=>"5",
  ":item_name"=>["Electric drill",
  "Screwdriver set"],
  "commit"=>"Go!"}

但控制器创建方法不断出错:

undefined method `each' for nil:NilClass` on the `params[:item_name]

来自控制器:

def create
    params[:item_name].each do |item|
      item = @signup_parent.inventories.build(inventory_params)
    end
end

def inventory_params
  params.require(:inventory).permit(:signup_id, {:item_name => []})
end

更新的控制器代码(请参阅下面的评论线程,仍然无法正常工作,但希望越来越接近)

def create
    params[":item_name"].each do |item|
      item = @signup_parent.inventories.build(inventory_params)
    end
end

def inventory_params
  params.permit(:signup_id, {:item_name => []})
end

查看代码 sn-p 以防有帮助:

<%= check_box_tag ":item_name[]", "#{thing}" %>
<%= hidden_field_tag :signup_id, "#{Signup.find_by_email(session[:signup_email]).id}" %>

【问题讨论】:

    标签: ruby-on-rails forms checkbox parameters


    【解决方案1】:

    你有":item_name"(带引号和冒号)参数,所以我想你应该用引号:

    params[":item_name"].each do |item|
    ...
    

    并更好地处理它如何从特定表单传递。

    inventory_params 也存在问题 - 没有您可以要求的 inventory,它们都在 root 中。所以我认为:

    params.require(:inventory).permit(:signup_id, {:item_name => []})
    

    行不通。您可以使用普通参数,也可以在前端处理它。但是,您可以在没有要求的情况下允许它们:

    params.permit(:signup_id, {':item_name' => []})
    

    或:

    params.permit!
    

    更新:您应该将文件更改为

    <%= check_box_tag "inventory[item_name][]", "#{thing}" %>
    <%= hidden_field_tag "inventory[signup_id]", "#{Signup.find_by_email(session[:signup_email]).id}" %>
    

    然后参数更改,以便您可以使用params.permit(:signup_id, {:item_name =&gt; []})

    【讨论】:

    • 您好,非常感谢!这种解决了问题,但不是所有的方式。现在我有两个问题:1):signup 参数无论出于何种原因都不再通过({"utf8"=&gt;"✓", "authenticity_token"=&gt;"m2NMruoFRr6lpsuVMK9UthlY0bsJsPmf1LWce2uKaH4=", ":item_name"=&gt;["Vacuum", "Air mattress"], "commit"=&gt;"Go!"})。 2)现在一切都是不允许的Unpermitted parameters: utf8, authenticity_token, :item_name, commit
    • 要解决这个问题,您可以使用params.permit! 允许所有参数,但也许您根本不能使用强参数。
    • 我很奇怪,如果不使用强参数就无法做到这一点。但无论哪种情况,permit! 都不起作用。出于某种原因,:signup_id 拒绝通过....(尽管其他所有内容都可以)。如果有帮助,我已经添加了视图代码
    • 是的,您应该正确地将参数传递给操作。告诉我你在哪里叫它。
    • 是的,但是其他呢。
    猜你喜欢
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多