Rails:自动将用户名添加到新帖子

时间:2015-11-16 04:50:00

标签: ruby-on-rails username posts

在我的帖子控制器中,我使用以下内容查看学生发布的不同帖子的用户ID:

def new
  @post = current_user.posts.build
end

这非常有用。但是,如果我也可以看到它们的名称和用户名,那将会更有用。现在我正在让学生手动输入他们的名字。

如何让新帖子自动获取登录用户的用户名和姓名?

4 个答案:

答案 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