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 %>  &nbsp; <%= current_user.profile.last_name %> 
  </div>

要查看用户的 usernamename@post 相关联,您可以执行以下操作:

username = @post.user.username
name     = @post.user.name

你应该经常去问 @postuser 属于用户的属性。

您也可以使用委托 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