在Rails中,我可以使用routes文件中的resources
自动为CRUD操作创建一组路由。
这会创建index
,new
,create
,edit
,show
,update
并销毁路线。
我理解这些路由如何工作的一般流程,并且通常在调用路由时,根据传递到相应操作的参数创建模型对象,并创建相应的视图或将客户端重定向到另一个指定的操作。
new
和edit
视图都可以使用相同的_form
部分来更新各自操作中的模型对象。但是,我很难理解客户端之后如何重定向到另一个操作。
例如,在new
操作中,客户端被重定向到create
操作,并且new
中更新的模型对象将作为参数传递给create
。我不明白这是怎么回事,因为没有指定重定向,我看不到模型对象如何变成参数。
def new
@article = Article.new
end
def create
@article = Article.create(article_params)
redirect_to(article_path(@article.id))
end
_form Partial:
<%= form_for(@article) do |f| %>
<ul>
<% @article.errors.full_messages.each do |error| %>
<li><%= error %></li>
<% end %>
</ul>
<p>
<%= f.label( :title ) %><br>
<%= f.text_field( :title ) %>
</p>
<p>
<%= f.label( :body ) %><br>
<%= f.text_area( :body ) %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
答案 0 :(得分:1)
当你在/articles/new
的路线中点击新动作时。 它呈现您的表单,如果您检查该表单,您将看到您的form_for生成的html就像这样
<%= form_for @article, html: {class: "nifty_form"} do |f| %>
<%= f.text_field :title %>
<%= f.text_area :body, size: "60x12" %>
<%= f.submit "Create" %>
<% end %>
及其HTML将是
<form accept-charset="UTF-8" action="/articles/create" method="post" class="nifty_form">
<input id="article_title" name="article[title]" type="text" />
<textarea id="article_body" name="article[body]" cols="60" rows="12"></textarea>
<input name="commit" type="submit" value="Create" />
</form>
因此,当您点击提交按钮时,您的表单会带您创建包含表单参数的文章方法
编辑操作中的相同表单
当您点击编辑操作articles/edit/1
时。如果您查看编辑操作,它将具有
def edit
@article = Article.find(params[:id])
end
因此,这会使您的表单呈现ID为<1>
的文章同样的表格会有html,看起来像这样
<form accept-charset="UTF-8" action="/articles/1/update" method="patch" class="nifty_form">
<input id="article_title" name="article[title]" type="text" />
<textarea id="article_body" name="article[body]" cols="60" rows="12"></textarea>
<input name="commit" type="submit" value="Update" />
</form>
请注意您的操作已在html中更改,因为您已在初始化@article的编辑操作中,并且您的表单会根据您的初始化变量生成网址
答案 1 :(得分:1)
嗯,它不使用重定向。它使用html表单操作引导您使用确切的方法。
澄清一下:
当你在&#34; / articles / new&#34;。 Rails会将您分派给Controller#new action。
并且,如果使用form_for
<%= form_for @article do |f| %>
<% end %>
它将生成html表单,如下所示:
<form accept-charset="UTF-8" action="/article" method="post">
</form>
如您所见,表单操作属性为"/article"
,它映射到资源中的CRUD操作。
然后,在您单击表单中的提交按钮后,表单中的数据将发送到表单标记操作属性中指定的create
操作。
我们使用的完全相同的部分_form(form_for)代码也可用于编辑文章。如果@article记录已存在于表中,则form_for将生成此html表单:
<form action="/article/1" class="edit_article" id="edit_person_1" method="post">
</form>
并且,您可以注意到,动作属性现在将引导您进入CRUD中的update
操作。
因此,form_for
反映了它所处理的资源的知识或记录识别,如Rails文档所述(http://guides.rubyonrails.org/form_helpers.html#2.3)
希望这有助于您理解它:)
答案 2 :(得分:1)
<强> OOP 强>
你的问题的底线答案是Rails是object orientated(由于构建在Ruby之上)。这非常很重要,因为它意味着 中的所有应该基于对象:
这引出了我的路线--Rails的resourceful
性质&#39;路由符合相同的想法,您需要在应用程序中使用对象 - 因此resources
指令提供了7个操作这些对象的关键操作
要完全理解Rails,你真的需要研究它如何与对象一起工作,特别是它们如何相互作用
<强>重定向强>
要回答有关redirect
的问题,简单的答案是 Rails没有&#34;重定向&#34;任何行动
请记住, Rails为stateless - 它不会通过请求保留数据 - 仅具有您当时初始化的数据,或者发了它
您感到困惑的是,某些Rails操作似乎将您的请求发送到相应的&#34;请求&#34;行动。答案就在于您使用的助手/方法,特别是 form_for
form_for 从其ActiveRecord对象构建表单。
因此,如果您执行以下操作:
#app/controllers/your_controller.rb
Class YourController < ActiveRecord::Base
def new
@model = Model.new
end
end
这将为Rails提供加载new
对象的知识,因此将使用form_for
方法将请求发送到 create 操作
如果您使用form_tag
,则无法重定向到create
操作 - 这是Rails的魔力 - 它是为了容纳对象而构建的/ p>