gpt4 book ai didi

ruby-on-rails - Rails3的start_form_tag等效于什么?

转载 作者:行者123 更新时间:2023-12-04 07:35:37 26 4
gpt4 key购买 nike

新手在这里...很明显,我正在研究一个旧的Rails教程。

要创建表单,他们具有以下代码:

<%= start_form_tag(:action => 'create')%>

<%= text_field(:album, :title) %><br />
<%= text_field(:album, :artist) %><br />
<%= text_field(:album, :genre) %><br />
<%= datetime_select(:album, :release_date) %><br />

<%= submit_tag("Create") %>

<%= end_form_tag %>

该代码正确的Rails3语法是什么?

谢谢。

最佳答案

自从Rails 1以来,已经发生了很多变化,那些真的愿意花时间坐在Rails 3上并学习差异的人给我留下了深刻的印象(1)。社区需要对此表示欢迎,而RTFM'er并没有帮助。我认为这是我可以提供帮助的地方。

我会在Rails 3中这样写:

<%= form_for(@album) do |f| %>
<p>
<%= f.label :title %>
<%= f.text_field :title %>
</p>

<p>
<%= f.label :artist %>
<%= f.text_field :artist %>
</p>

<p>
<%= f.label :genre %>
<%= f.text_field :genre %>
</p>

<p>
<%= f.label :release_date %>
<%= f.datetime_select :release_date %>
</p>

<%= f.submit %>
<% end %>

哇,变化太多了!我们从哪里开始?当然,最重要的是!
form_for是一种已在Rails中使用了一段时间的方法,并且在过去的几个主要修订中变得非常有用。此方法将采用 Controller 中设置的 @album变量,并检查它以确定几件事情:1)表单应该放在哪里2)字段的值应该是什么。

在这一阶段,我应该提到的是,您的 app/views/albums/new.html.erb现在应如下所示:
<h2>New Album</h2>
<%= render "form" %>

天哪,还有更多新东西!没关系: render "form"将部分渲染app/views/albums/_form.html.erb。这是上面的 form_for tomfoolery应该现在居住的地方。为什么?让我继续解释。

AlbumsControllernew操作中,您将获得以下内容:
def new
@album = Album.new
end
form_for足够聪明:“嘿,这是一种新的 Album资源,他可能想参加这种形式的 create操作,因为他是个好人,并且遵循Rails约定”,所以这正是它的作用。

除了:

这将引发一个异常(exception),即未定义 albums_path方法。什么啊

在Ruby on Rails 2中,RESTful路由成为一件大事。最好阅读 routing guide,因为如果我解释了一下,我只会重复很多。基本上:RESTful路由是应用程序URL路由的约定,该约定确定当我们对/albums执行POST(是表单,还记得吗?)时,它将转到 create操作。

但是,Rails如何知道要这样做呢?

因为在您的config/routes.rb文件中您放置了以下行:
resources :albums

这定义了到 Controller 默认行为“索引”(“索引”,“显示”,“显示”,“新建”,“创建”,“编辑”,“更新”和“销毁”)的路由。认真阅读 routing guide,以了解有关此美的所有知识。

回到我们的小 form_for。它知道去 /albums寻找一个新对象,这很酷。那么 f块参数怎么了?好的,这是一个表单生成器对象,它使我们能够通过 Album(以及不久之后的 new)操作为特定的 edit对象构建表单元素。当我们调用:
<%= f.text_field :title %>

我们正在做的Rails 1等效于:
<%= text_field :album, :title %>

Rails为您提供的只是一点点合成糖,以使您的 View 更加干燥。

我还向您的表单添加了标签,因为用户需要知道他们要填写的字段。这里的美丽之处在于,用户不会看到 :title,而会看到 Title。对于 :release_date,他们将看到“发布日期”。美丽的。

在表单末尾,我使用 f.submit。这将生成一个提交按钮,如果 @album是一个新对象,则显示“创建相册”,如果它是一个预先存在的对象,则显示“更新相册”。但是,先前存在的对象在哪里进行编辑?

edit Action 中!
def edit
@album = Album.find(params[:id]
end

在您的app/views/albums/edit.html.erb文件中,您将拥有与new.html.erb sibling 相同的文件:
<h2>Editing Album</h2>
<%= render "form" %>

您可以在这两者中精确地使用 相同的行来渲染相同的部分,但是如果对象是新对象或对象已经存在(通常称为持久化),它将表现出不同的效果。

edit操作呈现此部分的情况下,它将为表单生成到 /albums/1的路由,并对此资源进行Rails专业 PUT请求。我希望 routing guide可以很好地解释另一件事。

对于这个答案的长度,我感到很抱歉,但是对于这个问题,没有一个真正的简短答案。这是一个很大的变化,但是当我说它真的更好时,请相信我。

Rails 3岩石。

(1)并非如此的人少了。

关于ruby-on-rails - Rails3的start_form_tag等效于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3919846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com