如何捕获评论的作者然后显示在工具提示中?

时间:2011-09-02 06:09:51

标签: ruby-on-rails-3 forms comments

我有一个附加到个人资料的表单,可以提交简短的评论。我想捕捉作者的名字,所以当我将鼠标悬停在评论的正文上时,我可以在工具提示中显示它。

在控制器的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 个答案:

答案 0 :(得分:1)

您的解决方案看起来不错,但我会存储User(或任何类current_user返回)而不是Profile

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>

答案 1 :(得分:1)

我会建议这样的事情:

routes.rb创建嵌套资源以供评论

resources :users do
  resources :comments
end

User模型中

class User
  has_many :comments
end

Comment模型中

class Comment
  belongs_to :user
end

CommentsControllernew方法

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

因此,评论会自动创建为属于该用户,并且您不必传递任何内容。

然后,在“评论”视图中,您只需调用其所有者名称

即可
@comment.user.first_name