2014-12-17 3 views
1

У меня есть следующий метод, чтобы обновить несколько объектов сразу в одной форме:тестов обновления формы множественного объекта с 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) 

Так им не знает, как пройти аргументы.

Ну, я был бы признателен за любую помощь. Спасибо заранее.

ответ

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 } 
+0

10 thenks man. Это сделало это. – ntonnelier

Смежные вопросы