【发布时间】:2013-01-09 02:55:55
【问题描述】:
我做了一个资源。
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 指南指出:
应用程序的用户可以直接使用 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”,因为我们正在执行新操作吗?当我在 /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
【问题讨论】:
-
好的,我得到了更改为当前控制器的表单操作。我在
form_for中传递@dashboard而不是:dashboard。但是现在当我在控制器中执行 /new 操作时,表单操作不应该是 /dashboards/create 而不是 /dashboards/new? -
并且该方法也没有像指南所说的那样在表单中设置,如果我通过转到 /dashboard/:id/edit 进行更新
-
如果您将其更改为
:dashboard,那么您将切换到使用form tag helpers 而不是(面向资源的)form helpers。区别令人困惑,有关两者之间区别的更多信息,请参阅此答案:stackoverflow.com/questions/13537700/… -
您最初的内容大部分是正确的,但我会将
@dashboard切换为dashboard:form_for(dashboard),因为您使用:locals => { :dashboard => @dashboard }传入实例。 -
啊@shioyama 你是对的。那解决了它。干杯!
标签: ruby-on-rails-3 forms