2016-08-14 81 views
0

我想寫改變輪班來預訂的方法更新實例與另一個實例的PARAMS。但是我得到的錯誤如何從一個視圖

「未定義的方法'書」的#<輪班:0xc973ce0>」

,我不明白爲什麼。我只是希望它是一個按鈕,而不是一個單獨的編輯視圖。

編號:原來我把書的方法放在錯誤的地方,但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 

我是新來的導軌和學習在旅途中,我猜猜這個解決方案是微不足道的,但我找不到任何有助於我想做的問題或文檔。

+1

您已經在控制器中定義了一個方法,但正試圖在模型實例上調用它。 –

+0

謝謝,這有幫助!我不確定在哪裏放置該方法。但是,如果我把這個方法放在模型中,我會得到「未定義的方法'to_model'爲true:TrueClass」。任何有關導致該問題的提示? – SKR

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

完蛋了!

+0

感謝您花時間回答!你的解決方案可能是完美的,但我遇到了另一個問題,我的成員表中有一個名爲member_id的列,相當於我的應用中的用戶名,這與路由衝突,採用「用戶名」而不是自動分配的內部ID。我可以解決這個問題嗎?或者我必須在應用程序中更改列名稱嗎? – SKR

+0

獲得一個無路由匹配[GET]「/work_shifts/[work_shift.id]/book/[member ID]」 – SKR

+0

沒關係,我改變了我的routes.rb爲「資源:work_shifts做 \t成員做 \t補丁」 book /'=>'work_shifts#book',as:'book' \t end \t end \t get'work_shifts /:id/book'=>'work_shifts#book'' – SKR

相關問題