【问题标题】:Controller Namespaces and Routing issue控制器命名空间和路由问题
【发布时间】:2010-12-23 08:41:17
【问题描述】:

我使用一个模型“用户”创建了一个路由测试 rails3 应用程序:

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

添加到 routes.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"}

views/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>

【问题讨论】:

    标签: ruby-on-rails routing


    【解决方案1】:

    那是因为@admin_user 是一个User 对象,所以Rails 猜测URL 助手是users_path。这是一个简单的修复。只需将 @admin_user form_for 参数替换为 [:admin, @admin_user]。您可能还想重命名实例变量 @user 以减少重复。必须使用数组是使用命名空间的一个缺点,因此应始终考虑到这一点。

    【讨论】:

      【解决方案2】:

      form_for 方法不会猜测嵌套路由。试试这个:

      form_for [:admin, @admin_user] do |f|
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-07
        • 2015-07-05
        • 1970-01-01
        • 1970-01-01
        • 2012-01-25
        • 2017-12-13
        • 2023-03-11
        • 1970-01-01
        相关资源
        最近更新 更多