新手在这里...我正在经历,显然,一个旧的铁路教程.
要创建表单,他们有以下代码:
<%= start_form_tag(:action => 'create')%> <%= text_field(:album, :title) %>
<%= text_field(:album, :artist) %>
<%= text_field(:album, :genre) %>
<%= datetime_select(:album, :release_date) %>
<%= submit_tag("Create") %> <%= end_form_tag %>
这段代码的Rails3语法是什么?
谢谢.
自从Rails 1以来,已经发生了很多变化,我对那些愿意花时间坐下来使用Rails 3并了解差异的人印象深刻(1).社区需要欢迎这些,RTFM的人没有帮助.这是我认为我可以提供帮助的地方.
我会在Rails 3中这样写:
<%= form_for(@album) do |f| %><%= f.label :title %> <%= f.text_field :title %>
<%= f.label :artist %> <%= f.text_field :artist %>
<%= f.label :genre %> <%= f.text_field :genre %>
<%= f.label :release_date %> <%= f.datetime_select :release_date %>
<%= f.submit %> <% end %>
哇,这么多变化!我们从哪里开始?当然,顶线!
form_for
是一种在Rails中存在一段时间的方法,并且在过去几次重大修订中变得非常有用.这个方法将@album
在控制器中设置变量并检查它以确定一些事情1)表格应该去哪里2)字段的值应该是什么.
我应该在这个阶段提到应该提到你app/views/albums/new.html.erb
现在应该是这样的:
New Album
<%= render "form" %>
OMG,更多新东西!没关系:render "form"
将app/views/albums/_form.html.erb渲染为局部.这就是上面的form_for
tomfoolery应该生活的地方.为什么?让我继续解释.
在你AlbumsController
的new
行动中,你会有这样的事情:
def new @album = Album.new end
form_for
足够聪明:"嘿,这是一种新Album
资源,他可能想要create
采取这种形式的行动,因为他是一个好伙伴并遵循Rails惯例",所以这正是它的作用.
除了:
这将引发一个异常,即没有albums_path
定义方法.什么?
在Ruby on Rails 2中,RESTful路由变成了一件大事.最好是阅读路由指南,因为如果我解释它,我只会重复很多.基本上:RESTful路由是应用程序的URL路由的约定,它确定当我们对/ albums执行POST(它是一个表格,记住?)时,这将转到create
操作.
但Rails如何知道这样做呢?
因为在你的config/routes.rb文件中你已经把这行:
resources :albums
这定义了路由器到控制器的"七个"默认操作(索引,显示,新建,创建,编辑,更新和销毁).说真的,阅读路线指南,了解这个美丽的一切.
所以回到我们的小form_for
.它知道要去/albums
寻找一个很酷的新对象.那么f
块参数怎么了?好吧,这是一个表单构建器对象,它允许我们Album
从我们new
(很快edit
)的操作中为特定对象构建表单元素.当我们打电话:
<%= f.text_field :title %>
我们正在做Rails 1相当于:
<%= text_field :album, :title %>
这只是Rails给你的一点点合成糖,以使你的观点更加干燥.
我还在表单中添加了标签,因为用户需要知道他们填写的字段是什么.这里漂亮的部分是用户看不到:title
,但会看到Title
.因为:release_date
,他们会看到"发布日期".美丽.
在表格的最后,我使用f.submit
.这将生成一个提交按钮,如果@album
是新对象,则显示"创建相册";如果是预先存在的对象,则显示"更新相册".但是预先存在的对象在哪里被编辑?
在edit
行动中!
def edit @album = Album.find(params[:id] end
在你的app/views/albums/edit.html.erb文件中,你的new.html.erb兄弟中有很多相同的东西:
Editing Album
<%= render "form" %>
您可以使用精确的同在这两种线呈现相同的部分,但它会表现不同,如果对象是新的,或者如果它是预先存在的(通常被称为持久性).
如果edit
动作呈现此部分,它将生成/albums/1
表单的路径并PUT
对此资源执行Rails专业请求.我希望路由指南能够很好地解释另一件事.
对于这个答案的长度我感到很遗憾,但这个问题没有真正简短的答案,这是一个很大的变化,但是当我说它确实变得更好时相信我.
Rails 3岩石.
(1)与不是的人相比较少.