我需要同时更改两个不同模型的属性。我有一个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>
关于如何实现这一目标的任何建议将不胜感激,谢谢。
您可以在 Gig 控制器中执行此操作。
因此,在 gig#update 操作中,您可以使用如下所示将所有子请求设置为"拒绝":
@gig.requests.each do |request|
request.update_attributes(status: 'reject')
end
您希望确保仅在成功更新@gig时才触发此操作。
因此,使用回调从您的 Gig 模型处理此问题可能会更优雅