用户创建评论时。我们怎么能加上他的名字呢?我尝试过current_user,但显然只是说明当前用户的名字,而不是发表评论的人的姓名。
在评论模型has_many :comments, as: :commentable
中的用户模型belongs_to :commentable, polymorphic: true
中,在路径中使用resources :users do resources :comments end
细分。
视图/评论/ _comments.html.erb
<div id="comments">
<% @comments.each do |comment| %>
<div class="comment">
<%= current_user.name %>
<%= simple_format comment.content %>
</div>
<% end %>
评论控制器
class CommentsController < ApplicationController
before_action :load_commentable
before_action :set_comment, only: [:show, :edit, :update, :destroy]
before_action :logged_in_user, only: [:create, :destroy]
def index
@comments = @commentable.comments
end
def new
@comment = @commentable.comments.new
end
def create
@comment = @commentable.comments.new(comment_params)
if @comment.save
@comment.create_activity :create, owner: current_user
redirect_to @commentable, notice: "comment created."
else
render :new
end
end
def edit
@comment = current_user.comments.find(params[:id])
end
def update
@comment = current_user.comments.find(params[:id])
if @comment.update_attributes(comment_params)
redirect_to @commentable, notice: "Comment was updated."
else
render :edit
end
end
def destroy
@comment = current_user.comments.find(params[:id])
@comment.destroy
@comment.create_activity :destroy, owner: current_user
redirect_to @commentable, notice: "comment destroyed."
end
private
def set_comment
@comment = Comment.find(params[:id])
end
def load_commentable
resource, id = request.path.split('/')[1, 2]
@commentable = resource.singularize.classify.constantize.find(id)
end
def comment_params
params.require(:comment).permit(:content, :commentable)
end
end
我通过创建控制器在活动供稿工作中显示了各种名称。我是否有原则可以让它成功,因为我已经尝试过并且失败了。
class ActivitiesController < ApplicationController
def index
@activities = PublicActivity::Activity.order("created_at desc").where(owner_id: current_user.following_ids, owner_type: "User")
end
end
用户迁移
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.string :email
t.string :provider
t.string :uid
t.string :oauth_token
t.datetime :oauth_expires_at
t.timestamps null: false
end
end
end
评论迁移
class CreateComments < ActiveRecord::Migration
def change
create_table :comments do |t|
t.text :content
t.belongs_to :commentable, polymorphic: true
t.timestamps null: false
end
add_index :comments, [:commentable_id, :commentable_type]
end
end
valuations_controller
class ValuationsController < ApplicationController
before_action :set_valuation, only: [:show, :edit, :update, :destroy]
before_action :logged_in_user, only: [:create, :destroy]
def index
if params[:tag]
@valuations = Valuation.tagged_with(params[:tag])
else
@valuations = Valuation.order('RANDOM()')
end
end
def show
@valuation = Valuation.find(params[:id])
@commentable = @valuation
@comments = @commentable.comments
@comment = Comment.new
end
def new
@valuation = current_user.valuations.build
@commentable = @valuation
@comments = @commentable.comments
@comment = Comment.new
end
def edit
end
def create
@valuation = current_user.valuations.build(valuation_params)
if @valuation.save
redirect_to @valuation, notice: 'Value was successfully created'
else
@feed_items = []
render 'pages/home'
end
end
def update
if @valuation.update(valuation_params)
redirect_to @valuation, notice: 'Value was successfully updated'
else
render action: 'edit'
end
end
def destroy
@valuation.destroy
redirect_to valuations_url
end
private
def set_valuation
@valuation = Valuation.find(params[:id])
end
def correct_user
@valuation = current_user.valuations.find_by(id: params[:id])
redirect_to valuations_path, notice: "Not authorized to edit this valuation" if @valuation.nil?
end
def valuation_params
params.require(:valuation).permit(:name, :private_submit, :tag_list, :content, :commentable, :comment)
end
end
感谢您的时间!
答案 0 :(得分:2)
假设你有
class User
has_many :comments
...
end
class Comment
belongs_to :user
...
end
class CreateComments < ActiveRecord::Migration
def change
create_table :comments do |t|
t.text :content
t.belongs_to :user, index: true
t.timestamps null: false
end
end
end
您可以通过
获取用户的评论名称@comment = Comment.find(params[:id])
@comment.user.name
编辑:如果您想使用多态关联,请像这样编辑模型:
class User
has_many :comments, as: :commentable
...
end
class Comment
belongs_to :commentable, polymorphic: true
...
end
编辑:插入评论迁移
class CreateComments < ActiveRecord::Migration
def change
create_table :comments do |t|
t.text :content
t.references :commentable, polymorphic: true, index: true
t.timestamps null: false
end
end
end
与ValuationsController相关的编辑
您正在寻找创建特定评估评论的用户。 @valuation持有此评论。因此,您可以通过@valuation.commentable.user.name
获取用户 - 这假设您的Valuation设置了与Comment模型的正确关联。
删除@commentable = @valuation
和@comments = @commentable.comments
。它们没有错,但在这种情况下,保持具有相同值的变量没有任何意义。
在'show'动作中,您已经使用Comment.new指定了@comment。删除此行,因为您没有在show动作中创建新对象。
您已经在类顶部的before_action中使用相同的值分配了@valutation。为防止混淆,请在show action中删除此附加作业。
未来调试的线索:如果您的代码无法正常工作,请尝试在rails控制台中运行。我们昨天看到,@comment.commentable.user.name
周围的代码是正确的。这告诉我,你的控制器一定有问题。
将<%= User.find(comment.user_id).name %>
添加到_comments.html.erb