不完全确定如何构建此问题。我对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
?
答案 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(约定优于配置)。它是导轨的主要部分。理念。
约定优于配置(也称为按惯例编码)是软件框架使用的软件设计范例,其试图减少使用框架的开发人员在不必丧失灵活性的情况下做出的决策的数量。 David Heinemeier Hansson介绍了这个概念,用于描述Ruby on Rails Web框架的哲学,但它与早期的概念有关,例如&#34;合理的默认值&#34;用户界面设计中最不惊讶的原则