Пространства имен контроллера и проблема маршрутизации - PullRequest
5 голосов
/ 23 декабря 2010

Я создал приложение rails test rails3 с одной моделью 'User':

rails new routing_test_app
rails generate model User name:string
rails generate scaffold_controller admin/user
rake db:migrate

Добавлено в rout.db:

namespace :admin do
  resources :users
end

рейковые маршруты

admin_users GET    /admin/users(.:format)          {:action=>"index", :controller=>"admin/users"}
admin_users POST   /admin/users(.:format)          {:action=>"create", :controller=>"admin/users"}
new_admin_user GET    /admin/users/new(.:format)      {:action=>"new", :controller=>"admin/users"}
edit_admin_user GET    /admin/users/:id/edit(.:format) {:action=>"edit", :controller=>"admin/users"}
admin_user GET    /admin/users/:id(.:format)      {:action=>"show", :controller=>"admin/users"}
admin_user PUT    /admin/users/:id(.:format)      {:action=>"update", :controller=>"admin/users"}
admin_user DELETE /admin/users/:id(.:format)      {:action=>"destroy", :controller=>"admin/users"}

Вид / администратор / пользователи / _form.html.erb

<%= form_for(@admin_user) do |f| %>
  <% if @admin_user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@admin_user.errors.count, "error") %> prohibited this admin_user from being saved:</h2>

      <ul>
      <% @admin_user.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
    <%= f.text_field :name %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Когда я перехожу на 'http://localhost:3000/admin/users/new' rails выдает ошибку:

undefined method `users_path' for #<#<Class:0x0000010116ca90>:0x000001011588d8>

Извлеченный источник (вокруг строки # 1):

1: <%= form_for(@admin_user) do |f| %>
2:   <% if @admin_user.errors.any? %>
3:     <div id="error_explanation">
4:       <h2><%= pluralize(@admin_user.errors.count, "error") %> prohibited this admin_user from being saved:</h2>

Ответы [ 2 ]

5 голосов
/ 23 декабря 2010

Это потому, что @admin_user является User объектом, поэтому Rails предполагает, что URL-помощник будет users_path.Это простое исправление.Просто замените @admin_user form_for param на [:admin, @admin_user].Вы также можете переименовать переменную экземпляра @user для уменьшения повторения.Необходимость использования массива является недостатком использования пространств имен, поэтому всегда следует принимать это во внимание.

4 голосов
/ 23 декабря 2010

Метод form_for не будет угадывать вложенные маршруты.Попробуйте это:

form_for [:admin, @admin_user] do |f|
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...