4

私が達成しようとしているのは、Github のルートの方法に似たものです。たとえば、'question' という名前のプロジェクトがあると、URL は /hjuskewycz/question になります。したがって、私の目標は、最初のセグメントがユーザー名で、2 番目がプロジェクトの名前であるルートを持つことです。

私はいくつかの異なるアプローチを試しましたが、これは私が今行き詰まっているものです:

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 パラメーターを追加しています。とはいえ、エントリを追加するためだけにこの方法を至る所で使用するのは悪臭 (悪いコードの臭い) だと思います。この問題に対するよりエレガントな解決策があるのではないかと思います。

4

2 に答える 2

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

シンプルであるほど良い。時間を節約し、他の人にとって理解しやすい

于 2012-02-12T08:10:05.760 に答える
0

コントローラーで次のようなことをしたい:

before_filter :set_username

def set_username
  Rails.application.routes.default_url_options[:username] = @user.name
end
于 2013-05-15T08:55:09.563 に答える