有一个问题,这困扰着我。 我正在关注这个“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”如此重要?
答案 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
参数。这仅适用于创建,因为符号不代表现有记录。