Ruby on rails 提交具有两种不同模型的表单时出错

Ruby on rails 提交具有两种不同模型的表单时出错,ruby-on-rails,ruby,forms,model-view-controller,Ruby On Rails,Ruby,Forms,Model View Controller,我有一个办公室模型,它是当前所有办公室的列表。我还有一个日历模型,它可以作为公司的日历。我试图在本地主机上显示当前所有办公室的下拉列表:3000/日历/新,以便人们可以看到活动将在哪里举行。当我去提交表单时,我得到如下所示的错误。我也发布了所有相关代码。提前谢谢 Calendar.rb: class Calendar < ActiveRecord::Base belongs_to :office end _form.html.erb: <div class="field">

我有一个办公室模型,它是当前所有办公室的列表。我还有一个日历模型,它可以作为公司的日历。我试图在本地主机上显示当前所有办公室的下拉列表:3000/日历/新,以便人们可以看到活动将在哪里举行。当我去提交表单时,我得到如下所示的错误。我也发布了所有相关代码。提前谢谢

Calendar.rb:

class Calendar < ActiveRecord::Base
  belongs_to :office
end
_form.html.erb:

<div class="field">
  <%= f.label :office_id, class: "general-text-label" %><br>
  <%= collection_select :calendar, :office, @offices, :id, :name, {include_blank: true}, {class: "selectize"} %>
</div>

Rails正在尝试推断与新日历关联的办公室。您的日历正在生成为:

Calendar.new({"name"=>"Listing Agent Workshop", "description"=>"ffhfh", "date"=>"Friday Feb 17, 2017", "time"=>"4:00 PM", "office"=>"2"})
Rails知道office键是一个关联的模型,但它期望值是office的实际实例,而这里它只是一个字符串

相反,您应该指定id并让rails查找它,或者首先查找对象(如果这是一个问题)

第一种方法更改参数:

Calendar.new({"name"=>"Listing Agent Workshop", "description"=>"ffhfh", "date"=>"Friday Feb 17, 2017", "time"=>"4:00 PM", "office_id"=>"2"})
更好的方法:

office = Office.find(calendar_params[:office])
calendar_params[:office] = office
Calendar.new(calendar_params)

您可以发布到达服务器的参数吗。您可以在运行rails服务器rails的控制台上进行检查s@AbhishekKumar参数:{utf8=>✓, 真实性令牌=>lNP3u+HS2FystBTCLWWWJWIWW8HTFECZGVD4cdeogoF5WD2NIMNHTQUHJHPYNJP7CAIDIO09/mhvQg5rLhgtA=>calendar=>{name=>Listing Agent Workshop,description=>ffhfh,date=>2017年2月17日星期五,时间=>下午4:00,办公室=>2},提交=>Save}@AbhishekKumar所有这些都是正确的,所以我不确定我出了什么问题。这是你的错误,您通过的office=>2,日历对象需要ant office对象或office\u id。@Anthony,但2是office id…所以我有点迷路了。
Calendar.new({"name"=>"Listing Agent Workshop", "description"=>"ffhfh", "date"=>"Friday Feb 17, 2017", "time"=>"4:00 PM", "office"=>"2"})
Calendar.new({"name"=>"Listing Agent Workshop", "description"=>"ffhfh", "date"=>"Friday Feb 17, 2017", "time"=>"4:00 PM", "office_id"=>"2"})
office = Office.find(calendar_params[:office])
calendar_params[:office] = office
Calendar.new(calendar_params)