2

我做了一个资源。

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 %>

红宝石指南

红宝石指南指出:

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
4

1 回答 1

1

您是正确的,您应该能够“传递@dashboard到表单并让它处理动作、方法和其余部分”。这里的问题是newRESTful 操作的上下文中的内容。

当您使用 声明一组资源时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,即这是表单本身的路径。实际表单属性中的 URLaction是另外一回事:这是表单将通过POST请求将数据发布到的位置,在服务器(rails)端将映射到create控制器操作。

当您将表单助手与 一起使用时form_for(dashboard),会创建一个表单,其路径对应于dashboard:如果它是一条新记录(即数据库中尚不存在),则表单操作将是create(并指向/dashboards),而如果它已经存在,它将指向记录的实际 URL(例如/dashboards/123)。这就是表单助手如此有用的原因。

因此,总而言之,/dashboards正确的 URL 不是针对new操作,而是针对create操作,表单助手使用它是因为dashboard是一条新记录。new是表单所在页面的路径,即/dashboards/new.

希望这是有道理的。

@dashboardps 作为旁注,如果您将其作为本地 ( :locals => { :dashboard => @dashboard })传递,则不应在部分中访问。只需使用dashboard.

于 2013-01-09T03:06:38.270 回答