2016-08-14 8 views
0

WorkShiftをbooked:trueおよびbooked_by:current_member.member_idに変更するメソッドを記述したいと思います。しかし、私はエラービューから別のインスタンスのparamsでインスタンスを更新する方法

"#<ワークシフトのための未定義のメソッド`ブック」:0xc973ce0>" 取得

を、私は理由を理解していません。私はそれをボタンとし、別の編集ビューではないようにしたい。

編集:は私が間違った場所に本方法を置く判明したが、work_shifts.rbで同じ方法が「真のための未定義のメソッド `to_model」:TrueClass」スロー代わりに。私は(明らかに)ビューから別のオブジェクトのパラメータで1つのオブジェクトを更新するカスタムメソッドを呼び出す正しい方法は不明です。

マイindexビュー:

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

私はレールに新たなんだと、外出先での学習を、およびIソリューションを推測するのは簡単ではありませんが、私がやりたいことに役立つ質問やドキュメントは見つかりません。

+1

コントローラにメソッドを定義しましたが、モデルインスタンスでメソッドを呼び出そうとしています。 –

+0

ありがとうございました!私はその方法をどこに置くべきか分からなかった。しかし、私がモデルにメソッドを置くと、私は "trueのための未定義のメソッド' to_model 'を得る:TrueClass "。その問題を引き起こす原因についてのヒントは? – SKR

+0

ゼロコンテキストではありません。 –

答えて

1

リソースの1つのフィールドを変更しようとしているので、bookリンクはPATCHリクエストであり、GETでなくてはなりません。

これは、次のルート

book_work_shift PATCH /work_shifts/:id/book/:member_id(.:format) workshifts#book 

を生成し、

def book 
    @work_shift = WorkShift.find(params[:id]) 
    @work_shift.book(params[:member_id]) 
    # redirect to some view 
end 

としてあなたbookアクションを更新し、それに応じてモデルのメソッドを変更します

resources :work_shifts do 
    member do 
    patch 'book/:member_id' => 'work_shifts#book', as: 'book' 
    end 
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の代わりに "username"を取るルートと衝突します。私はこれを回避することはできますか?または私のアプリで列名を変更する必要がありますか? – SKR

+0

は "/work_shifts/[work_shift.id]/book/[memberのID]" – SKR

+0

気にしないで[GET] Noルートの一致を取得、私はに私のroutes.rbをを変えたのリソース:work_shiftsは \tメンバー \tパッチをしますか " 'work_shifts /:book' => 'work_shifts#book'のように 'work_shifts#book'を 'book'としてください:\t end \t end \t – SKR

関連する問題