如何使用视图中另一个实例的参数更新实例
How to update instance with params of another instance from a view
我想编写一个将 WorkShift 更改为 booked:true 和 booked_by:current_member.member_id 的方法。但是我收到错误
"undefined method `book' for #< WorkShift:0xc973ce0>"
我不明白为什么。我只希望它是一个按钮而不是一个单独的编辑视图。
编辑: 原来我把 book 方法放在了错误的地方,但是 work_shifts.rb 中的相同方法却抛出了 "undefined method `to_model' for true:TrueClass"。我(显然)不确定调用自定义方法的正确方法是什么,该自定义方法使用视图中另一个对象的参数更新一个对象。
我的索引视图:
<% @work_shifts.each do |work_shift| %>
<tr>
<td><%= work_shift.date %></td>
<td><%= work_shift.booked_by %></td>
<td><%= work_shift.booked %></td>
<td><%= work_shift.start_time.strftime("%H:%M") %></td>
<td><%= work_shift.stop_time.strftime("%H:%M") %></td>
<td><%= button_to 'Book', work_shift.book(current_member) %></td>
<% if current_member.admin? %>
<td><%= link_to 'Edit', edit_work_shift_path(work_shift) %></td>
<td><%= button_to "Ta bort", work_shift, :method=>:delete, :work_shift=>:destroy %></td>
<% end %>
</tr>
<% end %>
WorkShift.rb:
def book(member_id)
self.update(booked:true, booked_by: member_id)
end
routes.rb
resources :work_shifts do
member do
get 'book'
end
end
我是 rails 的新手,一直在学习,我猜这个解决方案很简单,但我找不到任何问题或文档可以帮助我完成我想做的事情.
由于您正在尝试修改资源的单个字段,因此 book
link 应该是 PATCH
请求而不是 GET
。
将您的路线更改为
resources :work_shifts do
member do
patch 'book/:member_id' => 'work_shifts#book', as: 'book'
end
end
这将生成以下路线
book_work_shift PATCH /work_shifts/:id/book/:member_id(.:format) workshifts#book
并将您的 book
操作更新为
def book
@work_shift = WorkShift.find(params[:id])
@work_shift.book(params[:member_id])
# redirect to some view
end
并相应地修改您的模型方法。
def book(member_id)
self.update(booked:true, booked_by: member_id)
end
并从
替换您的视图
<%= button_to 'Book', work_shift.book(current_member) %>
到 link(如果需要,您可以将其样式设置为按钮)
<%= link_to 'Book', book_work_shift_path(work_shift, current_member.member_id), method: :patch %>
就是这样!
我想编写一个将 WorkShift 更改为 booked:true 和 booked_by:current_member.member_id 的方法。但是我收到错误
"undefined method `book' for #< WorkShift:0xc973ce0>"
我不明白为什么。我只希望它是一个按钮而不是一个单独的编辑视图。
编辑: 原来我把 book 方法放在了错误的地方,但是 work_shifts.rb 中的相同方法却抛出了 "undefined method `to_model' for true:TrueClass"。我(显然)不确定调用自定义方法的正确方法是什么,该自定义方法使用视图中另一个对象的参数更新一个对象。
我的索引视图:
<% @work_shifts.each do |work_shift| %>
<tr>
<td><%= work_shift.date %></td>
<td><%= work_shift.booked_by %></td>
<td><%= work_shift.booked %></td>
<td><%= work_shift.start_time.strftime("%H:%M") %></td>
<td><%= work_shift.stop_time.strftime("%H:%M") %></td>
<td><%= button_to 'Book', work_shift.book(current_member) %></td>
<% if current_member.admin? %>
<td><%= link_to 'Edit', edit_work_shift_path(work_shift) %></td>
<td><%= button_to "Ta bort", work_shift, :method=>:delete, :work_shift=>:destroy %></td>
<% end %>
</tr>
<% end %>
WorkShift.rb:
def book(member_id)
self.update(booked:true, booked_by: member_id)
end
routes.rb
resources :work_shifts do
member do
get 'book'
end
end
我是 rails 的新手,一直在学习,我猜这个解决方案很简单,但我找不到任何问题或文档可以帮助我完成我想做的事情.
由于您正在尝试修改资源的单个字段,因此 book
link 应该是 PATCH
请求而不是 GET
。
将您的路线更改为
resources :work_shifts do
member do
patch 'book/:member_id' => 'work_shifts#book', as: 'book'
end
end
这将生成以下路线
book_work_shift PATCH /work_shifts/:id/book/:member_id(.:format) workshifts#book
并将您的 book
操作更新为
def book
@work_shift = WorkShift.find(params[:id])
@work_shift.book(params[:member_id])
# redirect to some view
end
并相应地修改您的模型方法。
def book(member_id)
self.update(booked:true, booked_by: member_id)
end
并从
替换您的视图<%= button_to 'Book', work_shift.book(current_member) %>
到 link(如果需要,您可以将其样式设置为按钮)
<%= link_to 'Book', book_work_shift_path(work_shift, current_member.member_id), method: :patch %>
就是这样!