Ruby on Rails:无法实现星级评分系统

我正在尝试为我的应用添加一个简单的星级评分系统,并以此教程为例。 我有用户,酒店和评级模型。 依赖关系是:

(rating.rb)

belongs_to :user belongs_to :hotel 

(hotel.rb)&(user.rb)

 has_many :ratings 

并在酒店视图中使用以下代码我收到此错误:

酒店#show中的NameError

类的未定义局部变量或方法`user’…

(在<%= form_for …行中)

酒店景观 (show.html.erb):

          {:id => form_id, :class => "star_rating_form"} do |f| %>  @hotel.id %>   current_user.id %>   form_id + "_stars" %>   <li class="rating_star" id="_" data-stars="" data-form-id="">  

评级控制器是:

 def create end def update end def rating_params params.require(:rating).permit(:stars) end 

迁移文件是:

 create_table :ratings do |t| t.integer :stars, :default => 0 t.references :store t.references :user end 

从评论中,错误似乎在这里:

 @hotel.ratings.find_or_create_by_user_id user.id 

用户身份

问题是您的show视图无法访问名为user的局部变量

这个变量应该在controller定义(这意味着它必须是一个@instance variable ,或者应该是一个帮助器(例如current_user.id

因此,修复应如下:

 <% user_id = user_signed_in? ? current_user.id : "-1" %> <%= form_for @hotel.ratings.find_or_create_by_user_id user_id ... 

这应该让你使用你提供的代码。 由于您没有从控制器提供new操作,我不知道代码的支持结构是否正确。

在对find_or_create_by进行一些搜索后,我将’form_for’更改为

 <%= form_for @hotel.ratings.find_or_create_by(user_id: user_id) 

这解决了这个问题!

感谢大家的支持!