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

时间:2014-07-18 22:03:39

标签: ruby-on-rails dependencies strong-parameters rating-system

我试图为我的应用添加一个简单的星级评分系统,并以this tutorial为例。我有用户,酒店和评级模型。依赖性是:

(rating.rb)

  belongs_to :user
  belongs_to :hotel  

(hotel.rb)& (user.rb)

has_many :ratings

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

  

Hotels#show中的NameError

     

未定义的局部变量或方法`user'对于班级......

(在<%= form_for ...

的行中)

酒店视图(show.html.erb):

      <% form_id = "hotel_#{@hotel.id}_rating" %>
      <% if signed_in? %> <!-- To avoid throwing an exception if no user is signed in -->
          <% user_id = current_user.id %>
      <% else %>
          <% user_id = -1 %>
      <% end %>        
          <%= form_for @hotel.ratings.find_or_create_by_user_id user.id, 
                      :html => {:id => form_id, 
                      :class => "star_rating_form"} do |f| %>
              <%= f.hidden_field :hotel_id, :value => @hotel.id %>
              <% if signed_in? %>
                  <%= f.hidden_field :user_id, :value => current_user.id %>
              <% end %>        
              <%= f.hidden_field :stars, :id => form_id + "_stars" %>
          <% end %>
      <% (1..5).each do |i| %>
          <li class="rating_star" id="<%= form_id %>_<%= i %>" data-stars="<%= i %>" data-form-id="<%= form_id %>"></li>
      <% end %>

评级控制器是:

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

2 个答案:

答案 0 :(得分:0)

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

@hotel.ratings.find_or_create_by_user_id 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操作,因此我不知道代码的支持结构是否正确。

答案 1 :(得分:0)

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

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

解决了这个问题!

感谢大家的支持!