使用radio_button变量计算嵌套表单控制器 - Rails 3

时间:2012-08-29 02:30:04

标签: ruby ruby-on-rails-3 activerecord

我有一个编辑表单,我有一个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

1 个答案:

答案 0 :(得分: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因为它已设置up没有构建post属性的哈希值,它只是一个独立的字段。

我希望这是有道理的,如果你不明白请留下评论,我会尝试解释更多。