1

我有一个编辑表单,我有一个单选按钮,我想将它传递给控制器​​操作,然后用它来进行计算。在我看来:

<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 语句中使用来决定是否需要在更新中添加或减去。但如果我也需要使用它,我也会在 post 中有一个 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:终于想通了,使用另一个模型Ratings来存储关联。我在 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_taghelper 而不是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 回答