如果用户尚未提交评论,我该如何才能显示添加评论表单?

时间:2011-04-12 23:45:53

标签: ruby-on-rails forms activerecord show-hide

嗨,我是一个超级初学者,并在我的第一个应用程序上工作,我有一个场地表,用户可以添加评论到场地。我希望能够在用户提交评论后隐藏评论表单,以阻止他们提交更多评论。

这就是我现在所拥有的:

在场地展示页面上添加评论表格

<% 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

2 个答案:

答案 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的场所的外键,因为评论属于场地,这将是标准的事情。