Метод url_for не может найти маршрут - PullRequest
5 голосов
/ 06 октября 2011

Я должен сделать редактирование / создание форм для нескольких таблиц на одной странице (настройки).Поэтому я создал 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 не может найти этот маршрут.Почему?

1 Ответ

4 голосов
/ 06 октября 2011

Вы определили 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

Однако Как уже упоминалось в комментариях, это, в основном, игнорирование всей поддержки, которую рельсы предоставляют, чтобы сделать это легко.Я бы порекомендовал:

  • определить маршрутизацию ресурсов для CaseStatus, которая может использовать все стандартные маршруты RESTful (это не значит, что вы не можете сделать все эти настройки видимыми на одной странице в / settings
  • используйте стандартные url-помощники вместо url_for
  • понимают, что вам не нужен отдельный путь для всех действий HTTP (например, show, update и delete обычно используют один и тот же путь, нос различными действиями HTTP)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...