怎么<%= f.submit%>知道在哪里发帖?

时间:2015-09-19 01:55:49

标签: ruby-on-rails

虽然在轨道上乱搞我编码:

<%= form_for :creature, url: "/creatures", method: "post" do |f| %>

  <%= f.text_field :name %>
  <%= f.text_area :description %>
  <%= f.submit "save creature" %>
<% end %>

我清楚地了解这个帖子的位置。 然而我发现这也有效:

<%= form_for @creature do |f| %>

  <%= f.text_field :name %>
  <%= f.text_area :description %>
  <%= f.submit "save creature", class: "btn btn-default"%>

<% end %>

我浏览了我的rails应用程序上的文件夹,我知道它仍然发布到此端点 post&#39; / creatures&#39; =&GT; &#39;#生物创建&#39; 即可。我想知道第二块代码知道如何仍然发布到该端点。从Node.JS迁移到Rails是有点心灵弯曲。

这是我好奇的控制器:

class CreaturesController < ApplicationController
  def index
    @creatures = Creature.all
  end

  def new
    @creature = Creature.new
  end

  def create
    new_creature = params.require(:creature).permit(:name, :description)
    creature = Creature.create(new_creature)
    redirect_to "/creatures/#{creature.id}"
  end

  def show
    id = params[:id]
    @creature = Creature.find(id)
      end
  end

5 个答案:

答案 0 :(得分:5)

form_for帮助程序解释给定的模型(在本例中为@creature)并使用rails约定来计算路径。查看生成的html表单。

有关详细信息,请参阅此处的文档:http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

答案 1 :(得分:1)

Rails使表单使用form builder,因此每个对象或网址都会生成默认网址。

  

要在此模板中创建表单,您将使用表单构建器。   Rails的主表单生成器由辅助方法提供   叫form_for。要使用此方法,请将此代码添加到

您可以在此处获取更多信息form builder rails

答案 2 :(得分:1)

<%= f.submit %>对POST的位置或内容一无所知。这只是在表单中创建一个提交标签。

重要的一点是form_for助手(您也可以将form_tag用于非资源丰富的表单)。它可以为您创建资源的表单操作路径,并具有指定方法的参数(POST,GET等)。

http://guides.rubyonrails.org/form_helpers.html#binding-a-form-to-an-object

答案 3 :(得分:1)

此处涉及的关键方法是polymorphic_path

此方法查看对象是否是新记录(通过persisted?方法),然后查看对象的model_name属性以找出用于路由的名称(这是ActiveModel接口的一部分,对象需要符合form_for以便能够自动计算出这样的事情。)

由此,polymorphic_path知道它需要使用creatures_path来构建URL。如果对象已被保存了。它本来会调用creature_path,将该生物作为参数传递。

单独form_for知道该方法应该是POST,因为对象未保存。

答案 4 :(得分:1)

f.submitstandard HTML formsubmit按钮一样聪明。

记住,Rails&#39; form helpers(以及其他HTML帮助程序)只是输出HTML的方法。因此,f.submit只会创建一个submit按钮。真正的魔法&#34;发生在HTML表单的action属性中:

<form action="url/for/action">
   <input type="submit" value="Submit">
</form>

-

为了理解Rails&#34;如何知道&#34;在表单提交后发送请求的位置,您需要了解Rails&#39; RESTful 的性质。路由。

您已经看过这样的路线:

#config/routes.rb
resource :controller

这会创建一系列围绕对象构建的资源丰富的路由。

因此,当您使用form_for之类的内容时,它需要一个可以应用自己路由的对象。 IE如果您的对象是new对象,它将推送到create路径;如果已填充,则会发送到update路径。

通过阅读form_for helper,您将获得很多收益。