Рубин на рельсах. Обновление разных моделей по одной ссылке

Мне нужно изменить атрибуты двух разных моделей одновременно. У меня модель gig. gig has_many requests У меня есть форма для изменения статуса gig на filled, и в то же время я хочу изменить статус запросов этих гигов на «отклонить». (Те, у кого еще нет статуса "нанят")

Запрос имеет status: string

У концерта filled: boolean

Модель запроса:

scope :nothired, -> { where.not(status: 'hired') }

Контроллер запроса:

def reject
  @request = Request.find(params[:id])
      @request.update(status: "reject")
      @request.save
      UserMailer.reject_notification(@request).deliver
      redirect_to gig_requests_path
      flash[:notice] = "MARKED AS REJECTED"
end

Посмотреть:

<%= simple_form_for @gig, :method => "put" do |t| %>
<% @gig.requests.nothired.each do |request| %>
<%= t.hidden_field :filled, :value => true %>

<%= t.submit t('dash.filltitle'), data: { confirm: "Are you sure?" }, class: "fill-gig-btn"  %>

<% end %>
<% end %>

Теперь я не уверен, как отформатировать это, чтобы включить действие контроллера requests.

Я попытался передать действие requests reject через скрытое поле (действие отклонения находится в контроллере и работает) с помощью:

 <%= t.hidden_field { controller: "requests", action: "reject", id: request.id }, method: :post %>

Но это дает:

undefined method `{:url=>{:action=>"reject", :controller=>"requests", :id=>53}, :method=>:post}' for #<Gig:0x0055ef27d98cc8>

Любые советы о том, как достичь этого, будут очень признательны, спасибо.


person Rob Hughes    schedule 17.02.2016    source источник


Ответы (1)


Вы можете сделать это в контроллере Gig.

Таким образом, в рамках действия gig#update вы можете установить для всех дочерних запросов значение «отклонять» примерно так:

@gig.requests.each do |request|
  request.update_attributes(status: 'reject')
end

Вы хотите убедиться, что это срабатывает только в том случае, если @gig был успешно обновлен.

Из-за этого может быть более элегантно обрабатывать это из вашей модели Gig с помощью обратных вызовов.

person Chris Austin    schedule 17.02.2016
comment
Я думал об этом, но действие «отклонить» в контроллере запросов настроено на отправку электронной почты каждому пользователю, создавшему запрос. Такое обновление статуса не вызовет этого действия. - person Rob Hughes; 17.02.2016
comment
Я понимаю. Опять же, возможно, вам следует больше полагаться на обратные вызовы для отправки этих электронных писем и удаления всего этого кода из контроллера? Вы могли бы попробовать поместить электронные письма в модель after_update внутри Request? - person Chris Austin; 18.02.2016