我有以下方法可以在一个表单中一次更新多个对象:
def update_by_day
company_calendars = CompanyCalendar.find(params[:company_calendars_ids])
company_calendars.each do |company_calendar|
unless update_calendar_params(company_calendar, params["company_calendar_" + company_calendar.id.to_s])
render js: "alert('Start time must be smaller then End time');"
break
end
end
end
def update_calendar_params(company_calendar, calendar_params)
company_calendar.time_from = company_calendar.time_from.change(:hour => calendar_params["time_from(4i)"], :min => calendar_params["time_from(5i)"])
company_calendar.time_to = company_calendar.time_to.change(:hour => calendar_params["time_to(4i)"], :min => calendar_params["time_to(5i)"])
company_calendar.save
end
表单将对象ID保存在隐藏字段上:
<%= form_for(:company_calendar, url: {action: "update_by_day"}, method: :put, remote: true) do |f| %>
<% company_calendars.each do |company_calendar| %>
<%= hidden_field_tag "company_calendars_ids[]", company_calendar.id%>
不是最优雅的代码,但工作正常。
现在我在编写测试时遇到了问题。这是我到目前为止所得到的:
it "updates all calendars from correspondent day" do
company_calendar = FactoryGirl.create(:company_calendar, company_id: @company.id )
put :update_by_day, {:day => company_calendar.day, company_id: @company.to_param, :company_calendar => { time_from: "2014-09-25 08:00:00", time_to: "2014-09-25 12:00:00" }, :format => :js }
expect(company_calendar.time_from).to eq( "2014-09-25 08:00:00" )
end
抛出以下错误:
Couldn't find CompanyCalendar without an ID
路由不使用id:
/companies/:company_id/company_calendars/update_by_day(.:format)
所以我不知道如何传递论据。
好的,我会感激任何帮助。 提前谢谢。
答案 0 :(得分:0)
您需要在company_calender_id
的规范中传递params
,因为您将其传递到隐藏字段并使用它在update_by_day操作的第一行中查找记录。
尝试下面的一个:
put :update_by_day, {:day => company_calendar.day, company_id: @company.to_param, :company_calendar => { time_from: "2014-09-25 08:00:00", time_to: "2014-09-25 12:00:00" },:company_calendars_ids => company_calendar.id, :format => :js }