虽然在轨道上乱搞我编码:
<%= 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
答案 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.submit
与standard HTML form的submit
按钮一样聪明。
记住,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,您将获得很多收益。