新的'如何?重定向到'创建'在Rails?

时间:2014-08-09 08:35:59

标签: ruby-on-rails forms redirect routes

在Rails中,我可以使用routes文件中的resources自动为CRUD操作创建一组路由。

这会创建indexnewcreateeditshowupdate并销毁路线。

我理解这些路由如何工作的一般流程,并且通常在调用路由时,根据传递到相应操作的参数创建模型对象,并创建相应的视图或将客户端重定向到另一个指定的操作。

newedit视图都可以使用相同的_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 %>

3 个答案:

答案 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部分
<%= 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之上)。这非常很重要,因为它意味着 中的所有应该基于对象:

enter image description here

这引出了我的路线--Rails的resourceful性质&#39;路由符合相同的想法,您需要在应用程序中使用对象 - 因此resources指令提供了7个操作这些对象的关键操作

要完全理解Rails,你真的需要研究它如何与对象一起工作,特别是它们如何相互作用


<强>重定向

要回答有关redirect的问题,简单的答案是 Rails没有&#34;重定向&#34;任何行动

请记住, Rails为stateless - 它不会通过请求保留数据 - 具有您当时初始化的数据,或者发了它

您感到困惑的是,某些Rails操作似乎将您的请求发送到相应的&#34;请求&#34;行动。答案就在于您使用的助手/方法,特别是 form_for


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>