我试图为我的应用添加一个简单的星级评分系统,并以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
答案 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)
解决了这个问题!
感谢大家的支持!