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

时间:2016-08-14 17:09:27

标签: ruby-on-rails model-view-controller nomethoderror

我想编写一个方法,将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并在旅途中学习,我猜这个解决方案很简单,但我找不到任何有助于我想做的问题或文档。

1 个答案:

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

多数民众赞成!