Как да заснема автора на коментар, след което да го покажа в подсказка?

Имам прикачен формуляр към профилите, където могат да се изпращат кратки коментари. Искам обаче да уловя името на автора, за да мога да го покажа в подсказка, когато задържа курсора на мишката върху основния текст на коментара.

В моя 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