嗨,我是一个超级初学者,并在我的第一个应用程序上工作,我有一个场地表,用户可以添加评论到场地。我希望能够在用户提交评论后隐藏评论表单,以阻止他们提交更多评论。
这就是我现在所拥有的:
在场地展示页面上添加评论表格
<% if reviewed? %>
<%= form_for [@venue, @review], :class => 'rating_ballot' do |f| %>
<%= f.label("value_1", content_tag(:span, '1'), {:class=>"rating", :id=>"1"}) %>
<%= radio_button_tag("review[rating]", 1, :class => 'rating_button') %>
<%= f.label("value_2", content_tag(:span, '2'), {:class=>"rating", :id=>"2"}) %>
<%= radio_button_tag("review[rating]", 2, :class => 'rating_button') %>
<%= f.label("value_3", content_tag(:span, '3'), {:class=>"rating", :id=>"3"}) %>
<%= radio_button_tag("review[rating]", 3, :class => 'rating_button') %>
<%= f.label("value_4", content_tag(:span, '4'), {:class=>"rating", :id=>"4"}) %>
<%= radio_button_tag("review[rating]", 4, :class => 'rating_button') %>
<%= f.label("value_5", content_tag(:span, '5'), {:class=>"rating", :id=>"5"}) %>
<%= radio_button_tag("review[rating]", 5, :class => 'rating_button') %> <br>
<p>title: <br>
<%= f.text_field :title %></p><br>
<%= submit_tag %>
<% end %>
<% end %>
应用程序控制器
class ApplicationController < ActionController::Base
helper :all # include all helpers, all the time
protect_from_forgery # See ActionController::RequestForgeryProtection for details
helper_method :reviewed?
protected
def reviewed?
true
end
private
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
end
我无法弄清楚审核的内容?帮助应该是允许我这样做的,非常感谢任何帮助!
修改
我已将has_reviewed帮助器添加到应用程序控制器,它现在显示此错误:
Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
Extracted source (around line #79):
76: <%= render :partial => 'reviews/review', :collection => @venue.reviews %>
77: </div>
78:
79: <% if reviewed? %>
应用程序控制器
class ApplicationController < ActionController::Base
helper :all # include all helpers, all the time
protect_from_forgery # See ActionController::RequestForgeryProtection for details
helper_method :current_user
helper_method :has_reviewed
helper_method :reviewed?
protected
def reviewed?
Review.has_reviewed(@current_user.id, venue.id)
end
def has_reviewed
!Review.where(:user_id=>user,:venue_id=>venue).blank?
end
private
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
end
其他编辑
我改变了评论?辅助方法:
def reviewed?
if current_user
Review.has_reviewed(@current_user.id, @venue.id)
else
nil
end
end
但它为#error
提供了未定义的方法`has_reviewed'模式的
场地有很多评论
用户有很多评论
评论属于用户和场所
路线如下:
App::Application.routes.draw do
resources :sessions
resources :users
resources :venues do
resources :reviews
end
end
答案 0 :(得分:1)
<% unless reviewed? %>
[...]
<% end %>
答案 1 :(得分:1)
假设您按照Wes的建议进行更改,reviewed?
方法将在数据库中查看此用户是否已进行审核。
评论表需要有一个列,供进行评审的用户和评论的场所使用。
所以代码看起来像这样......
已编辑以反映最近添加的架构
在控制器中
def reviewed?
if current_user
@current_user.has_reviewed(@venue.id)
else
nil
end
end
在用户模型中......
class User < ...
has_many :reviews
def has_reviewed(venueid)
reviews.exists?(:venue_id => venueid)
end
...
end
基本上我认为用户模型中的has_reviewed在用户has_many评论中更好,然后它可以检查用户是否已经查看了给定的场所。 我假设模型评论有一个名为venue_id的场所的外键,因为评论属于场地,这将是标准的事情。