2

Railsアプリに投票フォームをロードするパーシャルがあります(1〜5の範囲の数字を選択するだけです)。ユーザーがすでに投票した場合にロードする別のパーシャルを作成しています。これは、投票した値を選択し、必要に応じて変更できる EDIt パーシャルであると想定されます。しかし、何らかの理由で機能していません。これがそのコードです。

#Finds the vote by passing the user and the article  
<%= @vote = Vote.find_vote_by(current_user,@article) %>

#Renders the partial with the vote variable loaded up with the vote that was found
<%= render :partial => "votes/edit_vote", :locals => {:vote => @vote} %>

そしてこれがパーシャル

<% form_for(vote, :url => {:controller => 'votes', :action => 'edit'}) do |f| %>

<%= error_messages_for :vote %>

<p><%= f.hidden_field :article_id %></p>
<p>
  <%= f.label :value, "Value for the vote: "%>
  <%= f.select :value, {"1" => "1","2" => "2","3" => "3","4" => "4", "5" => "5"}, :selected => vote.value %>
</p>
<p>
   <%= f.submit "Cloud-it!" %>
</p>

<% end %>

しかし、何らかの理由で、投票変数には article_id や value メソッド以外のものが含まれていません。何かアイデアはありますか?

EDIT1:リクエストごとに、デバッグ@voteが出力しているものは次のとおりです(実際には正しい値です)

attributes: 
created_at: 2010-09-02 14:39:04
updated_at: 2010-09-02 14:39:04
id: 1
value: 4
article_id: 1
user_id: 1
attributes_cache: {}

EDIT2

これを出力するために、部分的なコードをクリアしようとしました:

<%= debug @vote%>
<%= @vote.value %>

@vote をデバッグすると、すべての属性などは完璧になります。しかし、2行目を追加するたびに、.valueがないことがわかり、.id、.articleを試してみましたが、存在しないかのようには何もありません。何か案は?

EDIT3

さんの投票はこちら

 named_scope :find_vote_by, lambda {|user,article| {:conditions => {:user_id => user, :article_id => article}}}
4

2 に答える 2

1

その背後にある理由は、名前付きスコープが実際に名前付きスコープを返すためであり、Voteクラスのように属性にアクセスすることはできません。投票を取得する方法を変更し、その名前付きスコープの使用を忘れることで、これを修正しました。私はそれを使用して達成しました:

 <% @vote = current_user.votes.find_by_article_id(@article)%>

これはRailsメソッドであり、実際には投票クラスを返します。それから私はそれをパーシャルに渡しました、そして魔法は働きました!

thenduksに感謝します。彼の助けがなければ、私はそれを行うことができませんでした。

于 2010-10-13T17:34:55.567 に答える
0

したがって、最初に修正するのは次の行です。

<%= @vote = Vote.find_vote_by(current_user,@article) %>

次のようにする必要があります。

<% @vote = Vote.find_vote_by(current_user,@article) %>

前者は ERB で出力するためのもので、後者は任意の ruby​​ コードを実行するためのものです。

次に、その下に次のような行を追加します。

<%= debug @vote %>

そして、それが適切な値であることを確認してください。Voteそうでない場合は、クラス メソッドの定義を貼り付けますfind_vote_by

編集:その場合、おそらく使用するとインスタンス変数が作成されるため、フォームでパーシャルを作成し:locals => {...}たいだけです。@vote

于 2010-09-17T20:23:58.807 に答える