我正在学习RoR,我喜欢到目前为止我发现的所有东西。我正在从基于PHP的CodeIgniter框架切换,我在使用 redirect_to 方法时遇到了问题。
我已经定义了一个用于处理注册的基本用户模型 - 数据在数据库中存储得很好,但问题是在将用户注册到系统后重定向时。
基本上,个人资料页面的格式如下: / users /:name /:id
我有一个路由文件定义如下:
resources :users
match '/users/:name/:id', :to => 'users#show'
这是我的创建方法
def create
@title = "User creation"
@user = User.new(params[:user])
if @user.save
info = { :name => @user.name, :id => @user.id }
redirect_to info.merge(:action => "show")
else
@title = 'Sign Up'
render 'new'
end
end
但是,这将生成以下格式的网址:
http://localhost:3000/users/27?name=Testing
当我真正寻找这样的东西时:
http://localhost:3000/users/Testing/27
从SEO的角度来看,对于我来说,个人资料页面网址看起来就是这样。我一直在寻找互联网,但我只找到解决不同问题的方法。我希望有人可以提供帮助。
解决 Ryan建议的两个版本都运行良好,我决定坚持第二个版本,因为它感觉更加RESTful。我只是分享我现在拥有的配置 - 请注意,User模型可能不是那么正确,但它是重要的to_param函数。此外,我注意到,如果我将函数私有,它不起作用 - 这是有道理的,但我只是认为我会分享那些可能遇到这种情况的人问题
这是我的路线档案:
resources :users
这是我的用户模型:
class User < ActiveRecord::Base
attr_accessible :name, :email
email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :name,
:presence => true,
:length => { :within => 5..50 }
validates :email,
:presence => true,
:format => { :with => email_regex},
:uniqueness => { :case_sensitive => false }
def to_param
"#{id}-#{name.parameterize}"
end
end
这是我的控制器创建功能:
def create
@title = "User creation"
@user = User.new(params[:user])
if @user.save
redirect_to @user
else
@title = 'Sign Up'
render 'new'
end
end
答案 0 :(得分:3)
像这样定义你的路线:
get '/users/:name/:id', :to => 'users#show', :as => "user"
然后使用此帮助程序重定向到它:
redirect_to(user_path(@user.name, @user.id))
或者,你可以坚持使用resources :users
,而不必定义自己的路线。这里的不同之处在于您的路线类似于/users/1-testing
而不是users/1/testing
,但优势在于您将成为更多Rails标准。
为此,请在模型中定义to_param
方法,如下所示:
def to_param
"#{id}-#{name.parameterize}
end
然后Rails将使用路由中to_param
方法的输出。