1

コントローラーアクションに渡したいradio_buttonがある編集フォームがあり、それを使用して計算を行います。私が持っているビューで:

<div class="field">
<%= radio_button_tag(:rating_select, "Up") %>
<%= label_tag(:rating_select, "Good.") %>
<%= radio_button_tag(:rating_select, "Down")%>
<%= label_tag(:rating_select, "Bad.")%>
</div>

私が持っているコントローラで:

def rating
@post = Post.find(params[:id])
.....
end

def update 
   @post = Post.find(params[:id])
   #@rating_select = params[:rating_select]
   if @post.rating_select == "Up"
   @post.score += 5
  elsif @post.rating_select == "Down"
   @post.score -= 5
  end
......
end

現在、if ステートメントを無視しているため、パラメーターが正しく設定されていません。理想的には、ビューの一時変数を使用して if ステートメントで使用し、更新で加算または減算する必要があるかどうかを判断したいと考えています。ただし、必要に応じて、ポストに rating_select フィールドもあります。ありがとう。

更新: ありがとう。それは理にかなっています。以下に変更しましたが、ラジオボックスに基づいてスコアを増減していません。だから、rating_select を取得していないようです?:

 def update
 @post = Post.find(params[:id])
  if params[:rating_select]=="Up"
   @post.score += 5
 elsif params[:rating_select]=="Down"
   @post.score -= 5
 end    
 respond_to do |format|
    ....    

UPDATE2: 最後に、別のモデル評価を使用して関連付けを保存しました。Post モデルで before_save を使用すると、計算と保存が可能になりました。なんて頭が痛い。

 before_save :set_rating
 def set_rating
   if self.rating.rating_select=="Up"
    rating.score += 5
   elsif self.rating.rating_select=="Down"
    rating.score -= 5
 end
end
4

1 に答える 1

1

まず最初に、更新アクションで読み込まれた投稿を表示しているコードでは、ビューからパラメーターを受け取っていません。

更新アクションのコードは通常、次のようになります。

def update
  @post = Post.find(params[:id])
  if @post.update_attributes(params[:post])
    ... do stuff ...
  else
    render :edit, :alert => 'Unable to update post.'
  end
end

form_tag次に、ヘルパーではなくヘルパーを使用してform_forいるため、モデルのすべてのパラメータが設定されていません(つまり、params [:post]の下にネストされています)。したがって、この場合、rating_selectオプションはそれ自体が値であり、次のようにテストできます。

if params[:rating_select]=="Up"
   ...
else
   ...
end

コードから理解できる重要なことは@post、params [:rating_select]を使用@post.update_attributes(params[:post])したradio_button_tagとしても、それについて何も知らないことです。これは、設定したので、投稿属性のハッシュを構築していないため、スタンドアロンフィールドにすぎないためです。

それが理にかなっていることを願っています。理解できない場合はコメントを残してください。もっと説明しようと思います。

于 2012-08-29T02:39:54.323 に答える