我有一个附加到个人资料的表单,可以提交简短的评论。我想捕捉作者的名字,所以当我将鼠标悬停在评论的正文上时,我可以在工具提示中显示它。
在控制器的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这些是配置文件的属性。或者有更简单,更好的方法吗?
更新:我让它显示名称虽然我仍然很好奇,如果有更好的方法。
答案 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
CommentsController
和new
方法
create
@comment = User.find(params[:user_id]).comments.new(params[:comment])
因此,评论会自动创建为属于该用户,并且您不必传递任何内容。
然后,在“评论”视图中,您只需调用其所有者名称
即可@comment.user.first_name