Bee*_*Bee 7 routing ruby-on-rails ruby-on-rails-3
当我尝试在我的用户模型中覆盖to_param以使用电子邮件地址作为id时,我的路由出错了.它似乎试图在尝试匹配路由时匹配id的整个对象.任何人都可以帮我弄清楚我错过了什么吗?
这是错误:
No route matches {:controller=>"users", :action=>"show", :id=>#<User id: 1, email: ....>}
Run Code Online (Sandbox Code Playgroud)
这是我如何设置代码.
车型/ user.rb:
attr_accessible :email
def to_param
email
end
Run Code Online (Sandbox Code Playgroud)
控制器/ users_controller.rb:
before_filter :get_user, :only=>[:show,:update,:edit,:destroy]
...
def get_user
@user = User.find_by_email params[:id]
end
Run Code Online (Sandbox Code Playgroud)
配置/ routes.rb中
resources :users
Run Code Online (Sandbox Code Playgroud)
这是rake路线的输出:
user GET /users(.:format) {:controller=>"users", :action=>"index"}
POST /users(.:format) {:controller=>"users", :action=>"create"}
new_user GET /users/new(.:format) {:controller=>"users", :action=>"new"}
edit_user GET /users/:id/edit(.:format) {:controller=>"users", :action=>"edit"}
user GET /users/:id(.:format) {:controller=>"users", :action=>"show"}
PUT /users/:id(.:format) {:controller=>"users", :action=>"update"}
DELETE /users/:id(.:format) {:controller=>"users", :action=>"destroy"}
Run Code Online (Sandbox Code Playgroud)
问题是电子邮件添加了'.' (点)在网址中,这会混淆rails,因为它试图找到"com"格式(如果电子邮件以.com结尾)
我已将此代码添加到我的某个应用程序(我有人而不是用户)并且它正常工作,所以诀窍是用其他东西替换点.我选择将其替换为"@",因为其他符号(如 - 或+)在电子邮件地址中有效.
文件person.rb
def to_param
email.sub ".", "@"
end
def self.param_to_email(param)
segments = param.split '@'
host = segments[1..-1].join('.')
segments[0] + '@' + host
end
Run Code Online (Sandbox Code Playgroud)
文件people_controller.rb
def get_person
email = Person.param_to_email params[:id]
@person = Person.find_by_email email
end
Run Code Online (Sandbox Code Playgroud)
在http://jroller.com/obie/entry/seo_optimization_of_urls_in中有一些关于它如何工作的提示.
谢谢你的问题,我刚开始使用rails,所以这真的帮助我理解它是如何工作的:).
归档时间: |
|
查看次数: |
2181 次 |
最近记录: |