我想编写一个方法,将WorkShift更改为预订:true和booked_by:current_member.member_id。但是我收到了错误
对于#< WorkShift:0xc973ce0>“”undefined method` book'“
我不明白为什么。我只是希望它是一个按钮,而不是一个单独的编辑视图。
编辑:结果我将book方法放在错误的位置,但是work_shifts.rb中的相同方法会抛出一个“未定义的方法`to_model'为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并在旅途中学习,我猜这个解决方案很简单,但我找不到任何有助于我想做的问题或文档。
答案 0 :(得分:1)
由于您尝试修改资源的单个字段,因此book
链接应为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_to 'Book', book_work_shift_path(work_shift, current_member.member_id), method: :patch %>
多数民众赞成!