我已经创造了一个资源。
resources :dashboards
我有一个包含表单的部分文件,我想使用这个部分(因为表单元素不会改变)来更新和创建。所以这就是我所拥有的:
控制器
class DashboardsController < ApplicationController
def new
@dashboard = Dashboard.new
end
end
查看
/dashboards/new.html.erb
<%= render :partial => "form", :locals => { :dashboard => @dashboard } %>
部分表格
/dashboards/_form.html.erb
<%= form_for(@dashboard) do |form| %>
.....
<% end %>
Ruby指南
Ruby指南声明:
文章模型可直接供应用程序的用户使用,因此 - 遵循使用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”,因为我们正在进行新的操作吗?当我在/ edit动作中使用相同的代码时,是否应该传递一个额外的字段来声明要放置的方法?
无论如何,我的结果总是一样的。形式永远不会改变。
我做错了什么?
修改
以下是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
答案 0 :(得分:1)
你是对的,你应该能够“将@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
的{{1}}请求,即这是表单本身的路径 。实际表单的/dashboards/new
属性中的URL是其他内容:这是表单将使用action
请求发布数据的位置,该请求在服务器(rails)端将映射到{ {1}}控制器动作。
当您使用带有POST
的表单帮助程序时,将创建一个表单,其中包含与create
对应的路径:如果它是新记录(即它在数据库中尚不存在) ,然后表单操作将是form_for(dashboard)
(并指向dashboard
),而如果它已经存在,则它将指向记录的实际URL(例如create
)。这就是使表单助手如此有用的原因。
因此,总而言之,/dashboards
是正确的网址,不适用于/dashboards/123
操作,而是适用于/dashboards
操作,表单助手使用该操作,因为new
是一项新纪录。 create
是表单所在页面的路径,即dashboard
。
希望这是有道理的。
P.S。作为旁注,如果您将其作为本地(new
)传递,则不应访问部分中的/dashboards/new
。只需使用@dashboard
。