Rails 3表单操作和方法



我做了一个资源。

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

相关内容

  • 没有找到相关文章

最新更新