2011-01-11 57 views
2

我正在使用Rails 3.我想知道如何將參數傳遞給routes.rb中的某些塊。如何將params傳遞給Rails路徑中的塊?

我想要做的是製作一個catch all路由,該路由從slugs數據庫檢查它的型號名稱。

得到model name後,我將其複數化以得到控制器名稱。

match '/:id', :controller => proc { Slug.find_by_iid(params[:id]).model.pluralize }, :action => :show 

slugs

model iid 
----- ----- 
post  4d2c7de0c5abe7f8a9000007 
item  4d2c7de0c5abe7f809000004 

當我試圖訪問一些網頁一樣/4d2c7de0c5abe7f8a9000007我得到這個錯誤:

Started GET "/4d2c7de0c5abe7f8a9000007" for 
127.0.0.1 at 2011-01-12 00:04:31 +0200 

ActionController::RoutingError (wrong constant name #<Proc:[email protected]): 

Rendered /Users/amr/.rvm/gems/[email protected]/gems/actionpack-3.0.3/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (1.2ms) 

預期是指上崗與IID#查看:4d2c7de0c5abe7f8a9000007

回答

8

proc返回一個Proc,但match需要一個字符串。您可以嘗試添加.call以使proc返回其值。雖然我不知道這是否會最終每一次,或者只在加載routes ...

編輯

看來我的方式關閉基地與我早先的反應和評論調用PROC。也許這樣?:

match '/:id', :to => proc { |env| 
    id = env["action_dispatch.request.path_parameters"][:id] 
    model = Slug.find_by_iid(id).model 
    controller = [model.pluralize.camelize,"Controller"].join.constantize 
    controller.action("show").call(env) 
} 

雖然這確實應該在庫中定義和包括。也許有人知道更好的方法?

+0

我可以刪除`proc`這樣` :controller => Slug.find_by_iid(params [:id])。model.pluralize`但問題仍然是如何獲得`params [:id]`值。當我嘗試運行應用程序時,它會拋出錯誤`../config/routes.rb:6:in`在中的塊:未定義的局部變量或方法`params'爲#(NameError)` – amrnt 2011-01-11 22:30:56

+0

當我做它`控制器=> proc {Slug.find_by_iid(params [:id])。model.pluralize} .call`它扔我`/config/routes.rb :6:在中的塊(2級)中:未定義的局部變量或方法`params'爲#(NameError)`ALSO! – amrnt 2011-01-11 23:15:06

0

把這個放在你的路線上看起來真的很詭異。我會建議創建一個Slugs控制器,將此任務傳遞到該控制器,並從那裏重定向到適當的控制器。假設你的其他頁面使用標準的REST風格的路線,你可以做這樣的事情:

更改路線是:

match '/:id', :controller => :slugs, :action => :show 

蛞蝓控制器:

def show 
    slug = Slug.find_by_iid(params[:id]) 

    redirect_to send("#{slug.model}_url", params[:id]) 
end 
相關問題