Rails 3 Routing: использование 2 динамических сегментов в пути для одной модели - PullRequest
4 голосов
/ 25 августа 2011

Я пытаюсь достичь чего-то похожего на способ Github для маршрутов. Например. У меня есть проект с именем 'question', результаты которого приведены в 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.

Я пытался в маршрутах.rb:

resources :projects, :path => "", :defaults => {:username => Proc.new { "just_testing" }}

, поскольку вы можете использовать процедуру для ограничений, но она также не работает.

Я пробовал в проекте. Rb

def to_param
    "#{owner.username"/#{project.title}"
end

Я уже потратил слишком много времени на эту проблему, и мой текущий подход использует удобный метод для добавления параметра: username. Тем не менее, я думаю, что использование этого метода повсеместно, просто чтобы добавить запись воняет (плохой запах кода). Интересно, есть ли более элегантное решение этой проблемы?

Ответы [ 2 ]

0 голосов
/ 15 мая 2013

Вы хотите сделать что-то подобное в вашем контроллере:

before_filter :set_username

def set_username
  Rails.application.routes.default_url_options[:username] = @user.name
end
0 голосов
/ 12 февраля 2012

Я думаю, вам не следует усложнять ситуацию, просто используйте что-то вроде этого:

In 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

Чем проще, тем лучше, это экономит время и легко понять для других

...