Rails: 自动将用户名添加到新 post
Rails: Automatically add username to new post
在我的帖子控制器中,我使用以下内容查看学生发布的不同帖子的用户 ID:
def new
@post = current_user.posts.build
end
这很有用。但是,如果我也能看到他们的姓名和用户名,那就更有用了。现在我让学生手动输入他们的名字。
如何让新帖子自动获取登录用户的用户名和姓名?
我猜你正在使用 Devise。所以在 _form.html.erb
你可以这样显示用户名...首先,假设每个 User has_one
:Profile (:username, :first_name, :last_name)
所以
user.rb
has_one :profile
profile.rb
belongs_to :user
在你的 Post 表单中你可以做
_form.html.erb
<div class="field">
<%= f.label :username %> : <%= current_user.profile.username %>
or (if you define a method in your Model that will return your first_name and last_name)
<%= f.label :full_name %> : <%= current_user.profile.first_and_last_name %>
or
<%= f.label :full_name %> : <%= current_user.profile.first_name %> <%= current_user.profile.last_name %>
</div>
要查看用户的 username
和 name
与 @post
相关联,您可以执行以下操作:
username = @post.user.username
name = @post.user.name
你应该经常去问 @post
的 user
属于用户的属性。
您也可以使用委托 method/Delegation 模式 described more here. API description is here。
class Post < ActiveRecord::Base
belongs_to :user
delegate :username, :name, :to => :user
end
然后您可以调用:@post.username
,这将 return 用户的用户名。
A post
created 使用您发布的代码将自动通过 .user
关联提供 user
的名称方法:
@post = Post.find x
@post.user.name #-> "name" of associated "user" model
既然你只发了一个new
方法,又问了后续问题,我给你写一段代码:
Right now I am making students manually type in their name
为什么学生无论如何都要输入他们的名字?
ActiveRecord
(和关系数据库)的重点是提供对关联数据的访问;在 users
table 中存储 user
详细信息(name
等),并通过 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
这将自动为您的新 post
设置 user_id
foreign key, 应该 允许您使用 @post.user.name
--
如果您想重构它,以避免 law of demeter
,您需要使用 Dewyze
推荐的 delegate
方法:
#app/models/post.rb
class Post < ActiveRecord::Base
belongs_to :user
delegate :name, to: :user, prefix: true #-> post.user_name
end
Dewyze
的回答有点错误,因为他会产生 @post.name
- 如果您想通过其模型识别记录,则需要 prefix
。
在我的帖子控制器中,我使用以下内容查看学生发布的不同帖子的用户 ID:
def new
@post = current_user.posts.build
end
这很有用。但是,如果我也能看到他们的姓名和用户名,那就更有用了。现在我让学生手动输入他们的名字。
如何让新帖子自动获取登录用户的用户名和姓名?
我猜你正在使用 Devise。所以在 _form.html.erb
你可以这样显示用户名...首先,假设每个 User has_one
:Profile (:username, :first_name, :last_name)
所以 user.rb
has_one :profile
profile.rb
belongs_to :user
在你的 Post 表单中你可以做
_form.html.erb
<div class="field">
<%= f.label :username %> : <%= current_user.profile.username %>
or (if you define a method in your Model that will return your first_name and last_name)
<%= f.label :full_name %> : <%= current_user.profile.first_and_last_name %>
or
<%= f.label :full_name %> : <%= current_user.profile.first_name %> <%= current_user.profile.last_name %>
</div>
要查看用户的 username
和 name
与 @post
相关联,您可以执行以下操作:
username = @post.user.username
name = @post.user.name
你应该经常去问 @post
的 user
属于用户的属性。
您也可以使用委托 method/Delegation 模式 described more here. API description is here。
class Post < ActiveRecord::Base
belongs_to :user
delegate :username, :name, :to => :user
end
然后您可以调用:@post.username
,这将 return 用户的用户名。
A post
created 使用您发布的代码将自动通过 .user
关联提供 user
的名称方法:
@post = Post.find x
@post.user.name #-> "name" of associated "user" model
既然你只发了一个new
方法,又问了后续问题,我给你写一段代码:
Right now I am making students manually type in their name
为什么学生无论如何都要输入他们的名字?
ActiveRecord
(和关系数据库)的重点是提供对关联数据的访问;在 users
table 中存储 user
详细信息(name
等),并通过 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
这将自动为您的新 post
设置 user_id
foreign key, 应该 允许您使用 @post.user.name
--
如果您想重构它,以避免 law of demeter
,您需要使用 Dewyze
推荐的 delegate
方法:
#app/models/post.rb
class Post < ActiveRecord::Base
belongs_to :user
delegate :name, to: :user, prefix: true #-> post.user_name
end
Dewyze
的回答有点错误,因为他会产生 @post.name
- 如果您想通过其模型识别记录,则需要 prefix
。