我有关于rails的friendly_id的红色文档。这很简单:你将某个属性设置为slug。
example.com/username
User has_one profile
Profile belongs_to User
所以你看到了我的困境。我在配置文件模型中没有列用户名。如何链接用户模型,用户名字段以便我可以使用friendly_id进行example.com/username?
当然这相对简单。
答案 0 :(得分:2)
您可以在路线文件的末尾使用“全部捕获”路线:
map.connect ':username', :controller => 'profiles', :action => 'show' (this is for Rails 2.3)
在配置文件控制器中,方法显示您是否有用户具有该用户名,以及是否属于当前配置文件
def show
if User.find_by_username(params[:username])
if @current_user == User.find_by_username(params[:username])
# @profile = @current_user.profile
# render projects#show view
else
# flash error message, because the current user tries to access other users profile (in case your app doesn't allow it)
else
# render page not found error
end
end
我对项目模型有类似的情况,来自projects / id => /项目名。 在您的情况下,它更容易一些,因为在数据库中您有唯一的用户名。 啊,并没有涉及额外的宝石。
答案 1 :(得分:1)
在ProfilesController#show
:
def show
@user = User.joins(:profile).where("profiles.username = ?", params[:username])
end
路线:
match ':username' => "profiles#show'
或者,您可以向User模型添加方法以使控制器更清洁:
class User < ActiveRecord::Base
def fetch_by_username(username)
joins(:profile).where("profiles.username = ?", username)
end
end
在你的控制器中:
@user = User.fetch_by_username(params[:username])
答案 2 :(得分:1)
您可以使用自定义方法生成所需的slu ..
class Profile < ActiveRecord::Base
has_many :users
has_friendly_id :custom_url_method, :use => :slugged
def custom_url_method
self.user.username.to_url
end
to_url来自Stringex gem。您也可以使用Friendly_id本身提供的Babosa帮助方法之一。