【发布时间】:2013-02-02 20:34:44
【问题描述】:
好的,我仍然是 ruby on rails 的新手,试图了解我的方法。我有两个模型(用户模型和评论模型)。基本上,用户有一个简单的个人资料,其中包含“关于我”部分和同一页面上的照片部分。用户必须登录才能评论其他用户的个人资料。
我的用户模型
class User < ActiveRecord::Base
attr_accessible :email, :name, :username, :gender, :password, :password_confirmation
has_secure_password
has_many :comments
.
.
end
我的评论模型
class Comment < ActiveRecord::Base
belongs_to :user
attr_accessible :content
.
.
end
在我的 cmets 表中,我有一个 user_id 列存储其个人资料已被评论的用户的 ID,还有一个 commenter_id 列存储对个人资料发表评论的用户的 ID。
意见表
<%= form_for([@user, @user.comments.build]) do |f| %>
<%= f.text_area :content, cols: "45", rows: "3", class: "btn-block comment-box" %>
<%= f.submit "Comment", class: "btn" %>
<% end %>
我的 cmets 控制器
class CommentsController < ApplicationController
def create
@user = User.find(params[:user_id])
@comment = @user.comments.build(params[:comment])
@comment.commenter_id = current_user.id
if @comment.save
.........
else
.........
end
end
end
这可以很好地将user_id 和commenter_id 存储在数据库中。在显示页面上显示用户 cmets 时出现了我的问题。我想获取对特定个人资料发表评论的用户的姓名。
在我的用户控制器中
def show
@user = User.find(params[:id])
@comments = @user.comments
end
我想从commenter_id 获取用户名,但是当我尝试comment.commenter.name 之类的东西时,它会不断抛出错误undefined method 'commenter' for #<Comment:0x007f32b8c37430>。但是,comment.user.name 工作正常,但它没有返回我想要的。我猜我没有得到正确的关联。
我需要帮助获取模型中的正确关联,以便从 commenter_id 中获取名称。
我的最后一个问题,如何捕捉 cmets 表单中的错误?它不是通常的form_for(@user),你喜欢@user.errors.any?。
routes.rb
resources :users do
resources :comments, only: [:create, :destroy]
end
【问题讨论】:
-
在你的评论类中,你可以添加一个带有自定义名称和外键的“自定义”关系:
belongs_to :commenter, foreign_key: 'user_id', class_name: 'User' -
见这里:api.rubyonrails.org/classes/ActiveRecord/Associations/…(他们的例子是 Person Author 和 Post)我给你的你应该能够做到
comment.commenter并且如果存在,这应该返回一个 User 对象
标签: ruby-on-rails model-associations rails-models