Hartl rails tutorial - current_user.microposts.build

时间:2016-05-29 04:51:48

标签: ruby-on-rails

不完全确定如何构建此问题。我对current_user.microposts.build的工作原理感到困惑,如下所示:

class MicropostsController < ApplicationController
  before_action :logged_in_user, only: [:create, :destroy]
  def create
    @micropost = current_user.microposts.build(micropost_params)
    if @micropost.save
      flash[:success] = "Micropost created!"
      redirect_to root_url
    else
      render 'static_pages/home'
    end
  end
  ...
end

据我所知,current_user之前已在会话助手中定义,但microposts来自哪里?我相信我们正在访问与具有belongs_to的用户链接的微博模型,但该模型本身称为Micropost - 那么rails如何知道Micropost =微博?另外,当我们使用belongs_to时,我们为什么要belongs_to :user代替belongs_to user

2 个答案:

答案 0 :(得分:1)

我不是100%熟悉本教程,但认为我可以回答您的所有问题。

  

微博来自哪里?

User模型上,您可能会有这样的一行:

has_many :microposts

当您定义这样的关联时,您可以将其作为从User类实例化的任何对象的方法。

  

我相信我们正在访问与具有belongs_to的用户链接的微博模型,但模型本身称为Micropost - 那么rails如何知道Micropost =微博?

约定是使用复数名称定义has_many关系,表示关联表示记录集合。

按照惯例,Rails使用inflections自动翻译单词from singular to plural(和vice versa),以确定要查找的模型类和数据库表。这是约定/默认值,但如果你真的想要,你可以覆盖它,尽管我会在95%的情况下反对这一点。

has_many :microposts, class_name: 'BlogPost'
  

此外,当我们使用belongs_to时,我们为什么要belongs_to :user代替belongs_to user

belongs_to user会导致错误,因为您正在说,&#34;调用belongs_to初始化程序并将第一个参数作为存储在变量user中的值传递。 &#34;我在你的例子中猜测变量user不会被定义。

belongs_to :user传递一个符号,排序就像一个字符串(即belongs_to 'user')。使用该符号,您可以指示belongs_to初始化名为user的关联。基于该符号,Rails推断出您引用的数据库表,模型类等,除非您告诉它使用我在前面的示例中使用的class_name之类的选项。

答案 1 :(得分:0)

Rails知道使用约定将模型Micropost链接到表microposts[model] + s = table(还有更复杂的复数规则)。该原则称为CoC(约定优于配置)。它是导轨的主要部分。理念。

Wikipedia entry

  

约定优于配置(也称为按惯例编码)是软件框架使用的软件设计范例,其试图减少使用框架的开发人员在不必丧失灵活性的情况下做出的决策的数量。 David Heinemeier Hansson介绍了这个概念,用于描述Ruby on Rails Web框架的哲学,但它与早期的概念有关,例如&#34;合理的默认值&#34;用户界面设计中最不惊讶的原则