Как зафиксировать автора комментария и отобразить его во всплывающей подсказке?

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

В моем create методе в контроллере у меня есть:

def create
  @comment = Comment.new(params[:comment])
  @comment.save!
  redirect_to profile_path(@comment.profile)
end

Внутри моей миграции:

t.timestamps
t.integer :profile_id
t.string :author_id
t.string :body

Модель профиля:

belongs_to :user
accepts_nested_attributes_for :user
has_many :comments

Модель комментария:

belongs_to :profile

ProfilesController:

def show
  @user = User.find(params[:id])
  @profile = user.profile
  @superlative = @profile.superlatives.new
end

И моя форма:

<%= form_for @comment do |f| %>
  <%= f.hidden_field :profile_id, :value => @profile.id %>
  <%= f.hidden_field :author_id, :value => "#{current_user.profile.first_name} #{current_user.profile.last_name}" %>
  <%= f.text_field :body %>
  <%= f.submit 'Add new' %>
<% end %>

Я думал связать: author_id с current_user.profile.id и использовать эту ассоциацию для отображения: first_name и: last_name, которые являются атрибутами профиля. Или есть способ попроще и лучше?

ОБНОВЛЕНИЕ: я получил его, чтобы отображать имя, хотя мне все еще интересно, есть ли лучший способ.


person tvalent2    schedule 02.09.2011    source источник
comment
Не могли бы вы добавить к вопросу определения вашей модели?   -  person Simon Ernst    schedule 02.09.2011
comment
Только что добавил, спасибо! Я заставил его работать, используя скрытое поле в форме и передав значение. Но если вы думаете, что может быть лучше, мне любопытно. Я все еще очень много изучаю программирование и Rails, поэтому стараюсь усвоить как можно больше лучших практик.   -  person tvalent2    schedule 02.09.2011
comment
Я не уверен, что скрытое поле - такая хорошая идея. Я мог изменить значение формы перед публикацией и выдать себя за кого-то другого. Если вы не проверите, что значение равно текущему пользователю, но зачем в таком случае ставить скрытое поле?   -  person Benoit Garret    schedule 02.09.2011
comment
@Benoit Отличный момент. Как новичок в программировании, я редко рассматриваю все возможности. Я ценю это!   -  person tvalent2    schedule 02.09.2011


Ответы (2)


Ваше решение выглядит нормально, но я бы сохранил User (или любой другой возвращаемый класс current_user) вместо Profile:

In app/models/comment.rb:

class Comment < ActiveRecord::Base

  belongs_to :profile
  belongs_to :author, :class_name => "User", :foreign_key => "author_id"

  ... rest of the code ...

end

Затем вы измените свою миграцию на:

t.integer :author_id

и ваш метод контроллера:

def create
  @comment = Comment.new(params[:comment].merge(:author_id => current_user.id))
  @comment.save!
  redirect_to profile_path(@comment.profile)
end

На ваш взгляд (я использовал атрибут title, действительно создавал всплывающую подсказку, но не стесняйтесь использовать любой метод, который вам нравится):

<div class="comment" title="<%= @comment.author.profile.first_name %> <%= @comment.author.profile.last_name %>">
  <%= @comment.body %>
</div>
person Benoit Garret    schedule 02.09.2011
comment
Я чувствую, что почти у цели, но что-то не так. Можете ли вы взглянуть на этот вопрос и сообщить мне, что вы думаете? stackoverflow.com/questions/7290954/ - person tvalent2; 03.09.2011

Я бы предложил примерно следующее:

В вашем routes.rb создайте вложенный ресурс для комментариев

resources :users do
  resources :comments
end

В вашей User модели

class User
  has_many :comments
end

В вашей Comment модели

class Comment
  belongs_to :user
end

В вашем CommentsController в методах new и create

@comment = User.find(params[:user_id]).comments.new(params[:comment])

Таким образом, комментарий автоматически создается как принадлежащий этому пользователю, и вам не нужно ничего передавать.

Затем в режиме просмотра комментариев вы можете просто назвать имя его владельца

@comment.user.first_name
person Simon Ernst    schedule 02.09.2011