У меня есть следующий метод, чтобы обновить несколько объектов сразу в одной форме:тестов обновления формы множественного объекта с RSpec
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
форма удерживает объекты ид на скрытое поле:
<%= 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)
Так им не знает, как пройти аргументы.
Ну, я был бы признателен за любую помощь. Спасибо заранее.
10 thenks man. Это сделало это. – ntonnelier