如何使用视图中另一个实例的参数更新实例

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 %>

就是这样!