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

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

В моем 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, которые являются атрибутами профиля. Или есть более простой и лучший способ?

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

Ответы [ 2 ]

1 голос
/ 02 сентября 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])

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

1 голос
/ 02 сентября 2011

Ваше решение выглядит хорошо, но я бы сохранил 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...