【问题标题】:The url_for method cannot find the routeurl_for 方法找不到路由
【发布时间】:2011-10-06 08:32:08
【问题描述】:

我必须在一页(设置)上为多个表格制作编辑/创建表单。因此我创建了 SettingsController。

路线:

resources :settings, :only => :index do
  member do
    get 'cs_edit'
    put 'cs_update'
    post 'cs_create'
    delete 'cs_destroy'
  end
end

控制器:

class SettingsController < ApplicationController
  before_filter :authenticate
...
def cs_create
  @cs = CaseStatus.find(params[:id])
  @cs.save

  redirect_to settings_path, :notice => 'Case Status was created successfully'
end

视图部分:

<%= form_for(@cs, :url => url_for(:action => 'cs_create', :controller => 'settings'), :class => 'status_form') do |cs_f| %>

问题是我收到以下错误:

Showing /home/michael/public_html/development/fbtracker/app/views/settings/index.html.erb where line #98 raised:

No route matches {:action=>"cs_create", :controller=>"settings"}
Extracted source (around line #98):

95:                   <% end %>
96:                 </table>
97: 
98:                 <%= form_for(@cs, :url => url_for(:action => 'cs_create', :controller => 'settings'), :class => 'status_form') do |cs_f| %>
99:                   <%= cs_f.text_field :name, :class => 'sname' %>
100:                  <%= cs_f.text_field :owt, :class => 'owt' %>
101:                  <%= cs_f.submit 'Add' %>

我也刚刚检查了路线:

$ rake routes
...
cs_edit_setting GET    /settings/:id/cs_edit(.:format)             {:action=>"cs_edit", :controller=>"settings"}
cs_update_setting PUT    /settings/:id/cs_update(.:format)           {:action=>"cs_update", :controller=>"settings"}
cs_create_setting POST   /settings/:id/cs_create(.:format)           {:action=>"cs_create", :controller=>"settings"}
cs_destroy_setting DELETE /settings/:id/cs_destroy(.:format)          {:action=>"cs_destroy", :controller=>"settings"}
settings GET    /settings(.:format)                         {:action=>"index", :controller=>"settings"}

如你所见,路由匹配 {:action=>"cs_create", :controller=>"settings"} 是存在的。但是 url_for 找不到这条路线。为什么?

【问题讨论】:

  • 我相信有一种更优雅的(rails 的)方式来构造 form_for 而不使用 url_for 方法。
  • 怎么做? :) 对不起,我是 Rails 的新手。
  • form_for( @cs, cs_create_setting_path, :class =&gt; 'status_form' )
  • @Bohdan 你是想说我应该使用嵌套资源吗?即:resources :settings { resources :case_statuses }
  • 为什么不使用设置控制器的默认路由和控制器名称?有两个不同的模型吗? SettingCaseStatus?

标签: ruby-on-rails ruby-on-rails-3.1


【解决方案1】:

您已将 cs_create 定义为成员方法,但您的 url_for 调用并未给它一个对象。如果你真的想这样使用url_for,你可以这样做:

url_for(:id => @cs.id, :action => 'cs_create', :controller => 'settings')

或者将其设为收集方法:

resources :settings, :only => :index do
  post 'cs_create', :on => :collection
  member do
    get 'cs_edit'
    put 'cs_update'
    delete 'cs_destroy'
  end
end

然而,正如 cmets 中所提到的,这基本上忽略了 rails 提供的所有支持以使其变得容易。我建议:

  • 为可以使用所有标准 RESTful 路由的 CaseStatus 定义资源路由(这并不意味着您不能在 /settings 下的单个页面上显示所有这些设置
  • 使用标准的 url 助手而不是 url_for
  • 了解您不需要为所有 HTTP 操作使用单独的路径(例如,显示、更新和删除通常共享相同的路径,但使用不同的 HTTP 操作)

【讨论】:

  • 是的。我非常同意这个回应。轨道方式!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
相关资源
最近更新 更多