0

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

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

    current_user.ratings.new

但这实际上或多或少在 ratingcontroller 中完成

使用这个辅助方法,表单看起来像这样

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

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

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

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

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

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

4

2 回答 2

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

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

于 2013-05-20T11:13:01.757 回答
0

我猜 的值为@ratingnil,这就是为什么使用此表单进行#create操作不起作用的原因。第一个参数应该是一个new对象,或者一个表示现有记录的对象,以便分别创建或更新。

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

于 2013-05-20T11:15:06.700 回答