我想要实现的是类似于Github的路线方式。例如。我在URL / hjuskewycz /问题中有一个名为'question'的项目。所以我的目标是让路线的第一段是用户名,第二段是项目的名称。
我尝试了几种不同的方法,这就是我现在所困扰的方法:
scope ":username" do
resources :projects, :path => "" do
resources :pictures
end
end
使用
project_path :username => project.owner.username, :id => project.to_param
按预期工作。但是,总是指定用户名是很繁琐的,尽管它始终是所有者的用户名。我非常喜欢
project_path(:id => project.to_param)
我知道default_url_options和url_for,我挖掘了代码。但是,polymorphic_url不使用default_url_options。
我试过routes.rb:
resources :projects, :path => "", :defaults => {:username => Proc.new { "just_testing" }}
因为你可以使用proc来进行约束,但是还没有使用它。
我在project.rb中尝试过
def to_param
"#{owner.username"/#{project.title}"
end
我花了太多时间处理这个问题,而我当前的方法使用了一个方便的方法来添加:username参数。尽管如此,我认为在整个地方使用这种方法只是为了添加一个条目臭(坏代码气味)。我想知道这个问题是否有更优雅的解决方案。
答案 0 :(得分:0)
我认为你不应该在这里弄复杂,只需使用这样的东西:
在Routes.rb
match ':username/:projectname/' => 'projects#show_project' , :as => :show_project
并在project_controller中,只需定义此
def show_project
@user =User.find_by_username(params[:username])
@project =Project.find_by_slug(params[:projectname])
end
更简单更好,它可以节省时间并且易于理解其他人
答案 1 :(得分:0)
你想在你的控制器中做这样的事情:
before_filter :set_username
def set_username
Rails.application.routes.default_url_options[:username] = @user.name
end