在我的帖子控制器中,我使用以下内容查看学生发布的不同帖子的用户ID:
def new
@post = current_user.posts.build
end
这非常有用。但是,如果我也可以看到它们的名称和用户名,那将会更有用。现在我正在让学生手动输入他们的名字。
如何让新帖子自动获取登录用户的用户名和姓名?
答案 0 :(得分:2)
您还可以使用委托方法/委派模式described more here。 API说明为here。
class Post < ActiveRecord::Base
belongs_to :user
delegate :username, :name, :to => :user
end
然后你可以打电话:@post.username
,这将返回用户的用户名。
答案 1 :(得分:1)
要查看与username
相关联的用户name
和@post
,您可以执行以下操作:
username = @post.user.username
name = @post.user.name
您应该始终向user
@post
询问属于该用户的属性。
答案 2 :(得分:0)
我猜你正在使用Devise。因此,在_form.html.erb
中,您可以显示这样的用户名...首先,让我们说每个用户 has_one
:个人资料 {{1} }
这样 user.rb
(:username, :first_name, :last_name)
profile.rb
has_one :profile
在你的邮政表格中你可以做到
belongs_to :user
_form.html.erb
答案 3 :(得分:0)
使用您已发布的代码创建的post
将自动通过user
关联提供.user
的名称方法:
@post = Post.find x
@post.user.name #-> "name" of associated "user" model
由于您只发布了new
方法,并且已经提出了问题,我将为您编写一些代码:
现在我正在让学生手动输入他们的名字
为什么学生必须输入他们的名字?
ActiveRecord
(和关系数据库)的重点是提供对关联数据的访问;将user
个详细信息(name
等)存储在users
表中,并通过posts
访问它。
这是您对posts
控制器所做的事情:
#app/controllers/posts_controller.rb
class PostsController < ApplicationController
def new
@post = current_user.posts.new
end
def create
@post = current_user.posts.new post_params
@post.save
end
def show
@post = Post.find params[:id]
@username = @post.user.name
end
end
这会自动为您的新user_id
设置post
foreign key,其中应该允许您使用{{{名}来调用该用户的名称1}}
-
如果您想重构此内容,以避免使用law of demeter
,则您希望@post.user.name
方法使用delegate
建议:
Dewyze
#app/models/post.rb
class Post < ActiveRecord::Base
belongs_to :user
delegate :name, to: :user, prefix: true #-> post.user_name
end
的答案有点不对,因为他会产生Dewyze
- 如果您想通过其模型识别记录,则需要@post.name
。