将符号/实例变量传递给form_for不会生成预期的操作

时间:2017-11-20 17:42:14

标签: ruby-on-rails

我看到这个answerthis都声称将符号传递给form_for之间的区别,即 <% form_for :post do |f| %>
<% form_for @post do |f| %>

一个区别是action = /posts/create,但我发现了一些不同的内容,实际上action=/posts而不是声明的内容。

当你传递一个实例时,你得到了

<form class="new_form" id="new_form" action="/forms"

但是当你传递一个符号时,你会得到

<form action="/forms"

(对于两个html版本我省略了字符集和隐藏等)

那是怎么回事?

1 个答案:

答案 0 :(得分:1)

<% form_for :post do |f| %><% form_for @post do |f| %>之间的区别在于后者binds the form to a model instance

后者实际上将“保留”用户在提交后键入的值。 form_for :post只是使用多态路由获取路径并将输入嵌套在键:post下。

两者都生成动作/posts(对于新记录),除非你真的弄乱了路线。如果记录为form_for @post/posts/:id将生成到#persisted?的路由,并将方法更改为修补程序。

这些是由资源创建的conventional routes

GET          /posts               posts#index
GET          /posts/:id           posts#show
GET          /posts/new           posts#new
POST         /posts               posts#create
GET          /posts/:id/edit      posts#edit
PATCH|PUT    /posts/:id           posts#update
DELETE       /posts/:id           posts#destroy

/posts/create不是常规路线,除非您手动定义路线,否则永远不会生成。