Как отобразить форму добавления отзыва, только если пользователь еще не отправил отзыв? - PullRequest
1 голос
/ 13 апреля 2011

Привет, я супер новичок и работаю над своим первым приложением, у меня есть таблица мест, и пользователи могут добавлять отзывы на места.Я хотел бы иметь возможность скрыть форму отзыва для пользователей после того, как они отправили отзыв, чтобы они не могли отправлять больше.

Это то, что у меня сейчас есть:

добавитьбланк отзыва на месте показа страницы

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

Не могу понять, что проверено?помощник должен позволять мне это делать, любая помощь очень ценится!

edit

Я добавил помощник 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

, но он дает неопределенный метод `has_reviewed 'для # error

схема

Место проведения имеет много отзывов

У пользователя много отзывов

Отзыв принадлежит пользователю и месту проведения

маршруты выглядят так:

App::Application.routes.draw do

  resources :sessions
  resources :users
  resources :venues do
    resources :reviews
  end
end

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

Предполагая, что вы вносите изменения в соответствии с предложением Уэса, метод reviewed? будет искать в базе данных, чтобы убедиться, что этот пользователь сделал обзор.

В таблице обзоров должен быть столбец дляпользователь, который сделал обзор, и место его рассмотрения.

Таким образом, код будет выглядеть примерно так ...

ИЗМЕНЕНО для отражения недавно добавленной схемы

В контроллере

def reviewed?
  if current_user
    @current_user.has_reviewed(@venue.id)
  else
    nil
  end
end

В модели User ...

class User < ...
  has_many :reviews

  def has_reviewed(venueid)
    reviews.exists?(:venue_id => venueid)
  end

  ...
end

В основном я считаю, что has_reviewed лучше в модели User, поскольку пользователь has_many просматривает, а затем он может проверить, если пользовательрассмотрел данное место.Я предполагаю, что в Модельном обзоре есть внешний ключ к месту проведения, называемый venue_id, так как Проверка принадлежит_ Месту проведения, и это будет стандартная вещь.

1 голос
/ 13 апреля 2011
<% unless reviewed? %>
[...]
<% end %>
...