初学者 Rails 增删改查

Beginner Rails CRUD

关于 newcreate 方法的快速初学者问题。 Ruby 指南显示了这个例子:

def new
  @article = Article.new
end

def create
  @article = Article.new(article_params)

  if @article.save
    redirect_to @article
  else
    render 'new'
  end
end

在指南的另一个示例中,new 方法中没有使用语句 @article = Article.new,这对我来说更有意义。 new 视图不需要 @article,form_for 接受模型名称的参数,然后定义一个变量供表单方法在 |something| 中使用。那么为什么我们需要建立 @article = Article.new 并有 @article 可用于视图?

您正在为 "create" 一篇文章编写表单,文章 class 可能有一些您可能希望在表单中显示的默认值,这样您就不必在视图本身中处理它。

同样如此,无论你有什么默认值,它都在同一个位置,你不需要更新两个文件。

下面两者是等价的 -

1. form_for(@article...........) /* @article = Article.new */
2. form_for(:article...........)

有关详细信息,请参阅 http://apidock.com/rails/ActionView/Helpers/FormHelper/form_for

但是,在 Rails 中,我们编写了 DRY 代码。因此,我们对 newedit 方法使用相同的 article_form 和实例变量 @article 是的,这个实例变量在视图中可用 -

def new
  @article = Article.new /* this is new article */
end

def edit
  @article = Article.find params[:id] /* Already exists in database */
end

并查看文件 -

new.html.erb 和 edit.html.erb 具有相同的形式

 <%= render "article_form" %>

根据文档 (http://guides.rubyonrails.org/form_helpers.html#binding-a-form-to-an-object),您的表单(如果使用 form_for 创建)需要一个模型实例来将输入绑定到模型属性。这样你就说你有一个新的 article 实例并且你的表单字段映射到它的属性,所以当提交表单时,你会收到以下形式的参数:

articles: {attributte1: 'something', attributte2: 'somethingelse'}

这样你就可以通过说 @article = Article.new(article_params) 来填充一个对象的实例,因为 article_params 被填充在你的控制器中的某个地方。