rails 4 form_for与f.select没有通过正确的参数,得到'param is missing`错误

时间:2015-05-26 17:03:02

标签: ruby-on-rails select form-for

我有一个共享部分使用select字段和options_for_select,但没有将正确的参数传递给控制器​​。

在users_controller.rb中,视图页面为user_home.html.erb:

def user_home
  if user_signed_in?
    @user = current_user
    @cpe_event = CpeEvent.new
  end
end

在我的cpe_events_controller.rb中,我有一个#create动作:

def create
  @cpe_event = CpeEvent.new
  @user = current_user     
  @cpe_event = current_user.cpe_events.build(cpe_event_params)
  ...

数据由form_for提交 - 共享部分(由users_controller视图呈现) - 有几个赞助商的下拉列表可供选择。我应该补充说,这是使用jQuery链接的三个下拉列表中的一个:

<%= form_for @cpe_event, url: cpe_events_path, method: :post, 
  html: { multipart: true }, class: 'form-inline form_for form_for_content' do |f| %>
<div>
  <div class="col-sm-3 col-md-3" style="float: left;">
    <% f.label :sponsor_name %>
    <%= f.select :sponsor_name, options_for_select(@sponsor_names), {},
      { class: "sponsor_name form-control btn-default", name: "sponsor_name"} %>
</div> 
....      

我怀疑问题是f.select而不是f.text-field - 以及如何使用form_for正确提交该数据。

我在@cpe_event = current_user.cpe_events.build(cpe_event_params)的{​​{1}}行上收到此错误:

cpe_events_controller.rb

允许的参数代码是:

param is missing or the value is empty: cpe_event

如果我在def cpe_event_params params.require(:cpe_event).permit(.... 之后放置raise params.inspect,我会收到提交的参数的哈希值:

def create

这就是为什么我收到400错误,即它不包含

{"utf8"=>"✓", "authenticity_token"=>"u1...1g==", "sponsor_name"=>"WI - TEST",
"class_date"=>"2014-01-01", "title"=>"How Account", "commit"=>"Submit",
"controller"=>"cpe_events", "action"=>"create"}

我尝试使用符号`"cpe_event" => {"sponsor_name"=>"WI - TEST", "class_date"=>"2014-01-01", "title"=>"How Account"...` 而不是模型对象:cpe_event提交表单但没有运气。

如何更正代码以提交正确/格式正确的参数?谢谢!

1 个答案:

答案 0 :(得分:0)

问题涉及在导轨/导轨表格(form_for)上使用红宝石,selectoptions_for_select在提交时会引发param is missing error。选择是使用jQuery Chained Selects Plugin链接的。链接终点导致Clark用这些解决方法解决的params错误:

如果您想保留HTML和插件设置,可以使用以下两种选项。

在JQuery中 - 正如我在下面的评论中所说,你应该为cpe_event的特定输入添加一个类,ex cpe_event_param并使用$('.cpe_event_param')代替$('input')

$('form').submit(function() {
    $('input').each(function() { //should probably use a class for this so you only do it to specific inputs
        $(this).attr('name', 'cpe_event[' + $(this).attr('name') + ']');
    });
});

或在rails中 -

def cpe_event_params
  cpe_event = Hash.new
  params.each do |k,v|
    cpe_event[k] = v
  end
  params[:cpe_event] = cpe_event
  #everything else you had