我做了一个资源。
resources :dashboards
我有一个包含表单的部分文件,我想使用这个部分(因为表单元素不会改变)来更新和创建。下面是我的代码:
控制器class DashboardsController < ApplicationController
def new
@dashboard = Dashboard.new
end
end
<<p> 视图/strong> /仪表板/new.html.erb
<%= render :partial => "form", :locals => { :dashboard => @dashboard } %>
<<p> 部分形式/strong> /仪表板/_form.html.erb
<%= form_for(@dashboard) do |form| %>
.....
<% end %>
<<p> Ruby指南/strong>Ruby指南说明:
Article模型对应用程序的用户是直接可用的,因此—按照使用Rails开发的最佳实践—您应该将其声明为资源。在处理RESTful资源时,如果依赖于记录标识,对form_for的调用会变得容易得多。简而言之,您可以只传递模型实例并让Rails计算出模型名称和其他内容。例如:
## Creating a new article
# long-style:
form_for(@article, :url => articles_path)
# same thing, short-style (record identification gets used):
form_for(@article)
## Editing an existing article
# long-style:
form_for(@article, :url => article_path(@article), :html => { :method => "put" })
# short-style:
form_for(@article)
结果我认为我正确地遵循了Rails指南。因为我让@dashboard成为一个资源。我可以把它传递给表单,让它处理动作、方法等。相反,我得到这个:
<form accept-charset="UTF-8" action="/dashboards" class="new_dashboard" id="new_dashboard_" method="post">
根据文档。我的表单的动作现在不应该是"/dashboards/new"吗,因为我们在新动作上?它应该通过一个额外的字段声明的方法,当我使用相同的代码/编辑操作?
我的结果无论如何都是一样的。形式永远不会改变。
我做错了什么?
编辑
这是我的路由器信息从rake routes
GET /dashboards(.:format) dashboards#index
POST /dashboards(.:format) dashboards#create
GET /dashboards/new(.:format) dashboards#new
GET /dashboards/:id/edit(.:format) dashboards#edit
GET /dashboards/:id(.:format) dashboards#show
PUT /dashboards/:id(.:format) dashboards#update
DELETE /dashboards/:id(.:format) dashboards#destroy
您应该能够"将@dashboard
传递到表单中并让它处理动作、方法和其他内容",这是正确的。这里的问题是new
在RESTful操作的上下文中是什么。
当您使用resources :dashboards
声明一组资源时,您正在创建一组将请求映射到控制器操作的路由:
GET /dashboards index
GET /dashboards/new new
POST /dashboards create
GET /dashboards/:id show
GET /dashboards/:id/edit edit
PUT /dashboards/:id update
DELETE /dashboards/:id destroy
如果你运行rake routes
,你可以检查这个。
new
动作被定义为GET
请求路径/dashboards/new
,即这是路由的形式本身。实际表单的action
属性中的URL是另一回事:这是表单将数据与POST
请求一起发布到的地方,该请求在服务器(rails)端将映射到create
控制器动作。
当你使用form_for(dashboard)
的表单助手时,一个表单是用一个与dashboard
相对应的路由创建的:如果它是一个新记录(即它还不存在于数据库中),那么表单动作将是create
(并指向/dashboards
),而如果它已经存在,它将指向记录的实际URL(例如/dashboards/123
)。这就是表单帮助器如此有用的原因。
综上所述,/dashboards
是正确的URL,不是new
操作的URL,而是create
操作的URL,表单帮助器使用dashboard
操作,因为CC_20是一个新记录。new
是到表单所在页面的路由,即/dashboards/new
。
希望这有意义。
注。作为旁注,如果您将其作为本地(:locals => { :dashboard => @dashboard }
)传递,则不应该在部分中访问@dashboard
。