Rails评级系统与奇怪的帮助方法

时间:2013-05-20 11:01:42

标签: ruby-on-rails ruby controller rating

有一个问题,这困扰着我。 我正在关注这个“Ruby on Rails” - 教程,以实现一个ajaxified评级系统 http://eighty-b.tumblr.com/post/1569674815/creating-an-ajaxified-star-rating-system-in-rails-3

死亡作者使用一种名为“rating_ballot”的自编写辅助方法,这对我来说似乎很多,因为它会检查是否已经给出了评级,否则会形成一个新的

    current_user.ratings.new

但实际上这在评级控制器中或多或少地完成了

使用此辅助方法,表单如下所示

= form_for(rating_ballot, :html => { :class => 'rating_ballot' }) do |f|

但是任何其他形式(例如发布评论)都使用实例变量而不是辅助方法。

我希望form_for标记看起来像这样

= form_for(@rating, :html => { :class => 'rating_ballot' }) do |f|

但这仅适用于更新评级,而不是创建新评级。

为什么这个“rating_ballot”如此重要?

2 个答案:

答案 0 :(得分:0)

看看那部分

def rating_ballot
    if @rating = current_user.ratings.find_by_photo_id(params[:id])
        @rating
    else
        current_user.ratings.new
    end
end

它尝试找出@rating是否存在,如果不存在则创建新实例

您可以在控制器中执行此操作,例如:

 @rating = current_user.ratings.find_by_photo_id(params[:id])
 @rating ||= current_user.ratings.new # create instance if did not find existing once

然后以像你写的那样使用它

答案 1 :(得分:0)

我猜测@rating的值为nil,这就是为什么在#create操作中使用此表单无法正常工作的原因。第一个参数应该是new对象,或者是表示现有记录的对象,以便分别创建或更新。

使用form_for方法的另一种替代方法是提供表示类名称的符号,并根据指定路由的方式指定:url参数。这仅适用于创建,因为符号不代表现有记录。