1

Rails 3 アプリケーションで提案するための単純なモデルがあります。インデックス ビューに単純な link_to リンクを追加しようとしています。クリックすると提案が承認済みとしてマークされます。

これまでのところ、次のコードがあります。

ルート.rb

resources :suggestions do
 get :approve
end

提案_コントローラー.rb

def approve
 @suggestion = Suggestion.find(params[:id])
 @suggestion.update_attribute(:approved, 'true')
 @suggestion.update_attribute(:approved_on, Time.now)
 redirect_to suggestion_path
end

提案.rb

attr_accessible :author, :details, :localip, :title, :approved, :approved_on

schema.rb

create_table "suggestions", :force => true do |t|
 t.string   "title"
 t.string   "author"
 t.text     "details"
 t.string   "localip"
 t.datetime "created_at",                     :null => false
 t.datetime "updated_at",                     :null => false
 t.boolean  "approved",    :default => false
 t.datetime "approved_on"
end

index.html.erb (提案)

<% if @suggestion.approved? %>
    <%= @suggestion.approved_on %>
<% else %>
    Not yet approved. (<%= link_to "Approve", approve_suggestion_url(@approve), :method => :put %>)
<% end %>

上記のコードを使用すると、次の例外エラーが発生します。

undefined method `approved?' for nil:NilClass

私はどこかで一歩を踏み出していませんか?

4

1 に答える 1

1

おそらく、投稿したコードは次のような each ループ内にあります

<% @suggestions.each do |suggestion| %>
  ...
  <% if @suggestion.approved? %>
    <%= @suggestion.approved_on %>
  <% else %>
    Not yet approved. (<%= link_to "Approve", approve_suggestion_url(@approve), :method => :put %>)
  <% end %>
<% end %>

インスタンス変数suggestionの代わりに変数を使用する必要があります。また、提案承認 URL を作成するには、代わりに@suggestionを使用する必要があります。コードは次のようになりますsuggestion@approve

  <% if suggestion.approved? %>
    <%= suggestion.approved_on %>
  <% else %>
    Not yet approved. (<%= link_to "Approve", approve_suggestion_url(suggestion), :method => :put %>)
  <% end %>

approveまた、アクションがメンバー アクションであることを反映するように、routes.rb を変更する必要があります。

resources :suggestions do
  put :approve, on: :member
end

メンバー ルートとコレクション ルートの違いを理解するには、ruby on rails のコレクション ルートとメンバー ルートの違いを参照してください。.

于 2012-08-03T13:19:20.490 に答える