特定资源路由操作的别名(“/ sign_in”而不是“/ sessions / new”)

时间:2010-08-15 02:14:02

标签: routing ruby-on-rails-3 alias

我在Rails 3中设置了没有任何宝石的restful身份验证和用户管理。

但是,我认为需要转到“/ sessions / new”而不是“/ sign_in”是愚蠢的。

我知道你可以为整个资源添加别名,所以我的用户可以使用“/ squirrels”和朋友来代替“/ sessions”和朋友,但那是我的意思我试图在这里完成。我想为一个具体行动添加别名。

我知道可以用

完成
resources :sessions, :path_names => { :new => "sign_in" }

然后路由最终为“/ sessions / sign_in” - 我不希望控制器名称完全用于此操作。我希望我可以用

指定
resources :sessions, :path_names => { :new => "/sign_in" }

其中“/”告诉rails它是一个完整的路径名。但这与第一个代码片段具有相同的效果。

我的最后一次尝试只是使用肤浅的

match "sign_in" => "sessions#new"

允许某人在其网址栏中手动输入“/ sign_in”,但与new_session_(path|url)建立的链接仍然会让用户处于更加尴尬的“/ sessions / sign_in”。

5 个答案:

答案 0 :(得分:5)

match "sign_in" => "sessions#new", :as => :new_session

答案 1 :(得分:2)

对于较新版本的Rails,您无法再使用匹配。而是使用http动词。

示例:

get "sign_in" => "sessions#new", :as => :new_session

请注意,我使用了get而不是匹配。

在Rails 4.0.0上测试

答案 2 :(得分:1)

添加以下行:

map.sign_in '/sign_in', :controller => 'session', :action => 'new'

config/routes.rb

答案 3 :(得分:0)

match "sign_in" => "sessions#new"

行创建一个名为“sign_in”的路线,您可以使用该路线代替“new_session”。因此,无论您使用“new_session_path”链接到任何内容,请将其替换为“sign_in_path”。

这很好。我原本希望做的事情会很好 - 将“new_session_path”链接到与“sign_in_path”相同的东西。能够指定不包含控制器的path_name。然后我根本不需要match行。

答案 4 :(得分:0)

“路径”属性怎么样?这应该做你想要的。

devise_for :users,
path: '',
controllers: {
  sessions: "user/sessions",
  passwords: "user/passwords",
  confirmations: "user/confirmations",
  registrations: "user/registrations"
},
path_names: {
  sign_in: "login",
  sign_out: "logout",
}