Rails 3形成了动作和方法

时间:2013-01-09 02:55:55

标签: ruby-on-rails-3 forms

我已经创造了一个资源。

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

1 个答案:

答案 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