2011-03-20 127 views
0

我在繼續學習Rails 3的過程,但路由讓我瘋狂。我正嘗試使用名稱空間來分隔網站的管理部分。問題是命名空間中的某些內容根本無法正常工作,並且還會路由到錯誤的地方。例如,使用rails通過指定資源生成路由時,視圖在傳遞對象時指向錯誤的路由,因此編輯表單不起作用。命名空間路由導致惡夢

即使路線確實存在,它與link_to的鏈接也不起作用。首先這裏是從rake路由輸出的命名空間路由。

namespace :admin do 
    resources :users 
end 


admin_users GET  /admin/users(.:format)   {:action=>"index", :controller=>"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 PUT /admin/users/:id(.:format)  {:action=>"update", :controller=>"admin/users"} 
       DELETE /admin/users/:id(.:format)  {:action=>"destroy", :controller=>"admin/users"} 

控制器:

class Admin::UsersController < ApplicationController 

    def index 
    @users = User.all 
    end 

    def show 
    @user = User.find(params[:id]) 
    end 

    def new 
    @user = User.new 
    end 

    def edit 
    @user = User.find(params[:id]) 
    end 

    def create 
    @user = User.new(params[:user]) 
    if @user.save 
     redirect_to(@user, :notice => 'User was successfully created.') 
    else 
     render :action => "new" 
    end 
    end 

    def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(params[:user]) 
     redirect_to(admin_users_path, :notice => 'User was successfully updated.') 
    else 
     render :action => "edit" 
    end 
    end 

    def destroy 
    @user = User.find(params[:id]) 
    @user.destroy 
    redirect_to(admin_users_path) 
    end 
end 

實施例視圖:index.html.erb列出所有用戶

<h1>Listing users</h1> 

<table> 
<% for user in @users %> 
    <tr> 
    <td><%= user.id %></td> 
    <td><%= user.username %></td> 
    <td><%= user.email %></td> 
    <td><%= link_to 'Show', @user %></td> 
    <td><%= link_to 'Edit', edit_admin_user_path(user) %></td> 
    <td><%= link_to 'Destroy', admin_user_path, :confirm => 'Are you sure?', :method => :delete %></td> 
    </tr> 
<% end %> 
</table> 

<br /> 

<%= link_to 'New User', new_admin_user_path %> 

使用編輯視圖也有問題。編輯表單應該指向更新路由,但不是。相反,它只在傳遞一個User對象時指向編輯路徑(基本上就是它自己)。從我一直使用窗體中的對象閱讀的東西是推薦的方法,但如果它不起作用,這不是一件好事。

我列出所有用戶頁面時出現此錯誤。

No route matches {:action=>"update", :controller=>"admin/users"} 

Extracted source (around line #17): 
17:  <td><%= link_to 'Destroy', admin_user_path, :confirm => 'Are you sure?', :method => :delete %></td> 

我很想努力堅持下去,但是這讓我感到疲倦。僅供參考:是的,我知道有認證框架,但我正在嘗試從頭開始制定認證框架。這是一種學習體驗,因此,僅僅使用寶石和插件就不會成爲我認爲的方式。

謝謝 Onyth

回答

5

你缺少ID的刪除鏈接

嘗試用

<td><%= link_to 'Destroy', admin_user_path(user), :confirm => 'Are you sure?', :method => :delete %></td> 

(改變admin_user_pathadmin_user_path(用戶)爲紐帶)

+1

已經工作了,謝謝你,但仍然是一個形式問題。 <%=的form_for:用戶做%> 使得 <形式行動= 「/管理/用戶/ 1 /編輯」 方法= 「POST」> 但應/管理/用戶/ 1和上放置方法進行更新。如果我在表單標籤中使用@user,它只會拋出user_path – pieterk 2011-03-20 11:36:48

+3

嘗試'<%= form_for [:admin,@user] do%>' – Teoulas 2011-03-20 13:08:33

+1

奇怪的Rails腳手架如何正確處理名稱空間。 – pieterk 2011-03-20 14:15:11

2

如果你做了條耙路線你會看到這樣的內容:

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

所以,你可以得到

admin_user_path 

這將是相同的

user_path 

然後,你會通過@user在admin_user_path像這樣:

admin_user_path(@user) 

The:方法應該調用destroy方法,而不是自動進入show方法!:)

要得到的form_for工作,我發現了以下資源:http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for

下的form_for部分,他們解釋命名空間的form_for路由爲:

For namespaced routes, like admin_post_url: 

    <%= form_for([:admin, @post]) do |f| %> 
    ... 
    <% end %> 

有關所耙路線檢查出:http://guides.rubyonrails.org/command_line.html#rake-is-ruby-make然後根據部分2.4.9其他任務他們解釋耙 - 任務顯示您可以使用的各種耙指令和耙線路顯示您可用的路線路徑。

希望這會有所幫助!