Лучший способ создать Rails route как для ресурса (единственное число), так И для ресурсов (множественное число)?

#ruby-on-rails #ruby-on-rails-3 #routing #routes

#ruby-on-rails #ruby-on-rails-3 #маршруты

Вопрос:

У меня есть profile модель в моем приложении. Я хочу разрешить пользователю просматривать свой собственный профиль через /profile , поэтому я создал этот маршрут:

 resource :profile, :only => :show
  

Я также хочу, чтобы пользователь мог просматривать профили других пользователей через /profiles/joeblow , поэтому я создал этот маршрут:

 resources :profiles, :only => :show
  

Проблема в том, что во втором случае есть :id параметр, который я хочу использовать для поиска профиля. В первом случае я просто хочу использовать профиль зарегистрированного пользователя.

Это то, что я использую, чтобы найти правильный профиль, но мне интересно, есть ли более подходящий способ, которым я мог бы это сделать.

 class ProfilesController < ApplicationController
  before_filter :authenticate_profile!
  before_filter :find_profile

  def show
  end

  private

    def find_profile
      @profile = params[:id] ? Profile.find_by_name(params[:id]) : current_profile
    end
 end
  

Редактировать: Одна из проблем с этим методом — мои маршруты. Я не могу вызвать profile_path без передачи параметра profile / ID, что означает, что в любое время я должен использовать строку ‘/ profile’ всякий раз, когда мне нужно связать там.

 $ rake routes | grep profile
  profile GET    /profiles/:id(.:format) {:action=>"show", :controller=>"profiles"}
          GET    /profile(.:format)      {:action=>"show", :controller=>"profiles"}
  

Ответ №1:

Ваши маршруты:

 resource :profile, :only => :show, :as => :current_profile, :type => :current_profile
resources :profiles, :only => :show
  

Тогда ваш ProfilesController

 class ProfilesController < ApplicationController
  before_filter :authenticate_profile!
  before_filter :find_profile

  def show
  end

  private

  def find_profile
    @profile = params[:type] ? Profile.find(params[:id]) : current_profile
  end
end
  

Ваша Profile модель

 class Profile < AR::Base
  def to_param
    name
  end
end
  

Число просмотров:

 <%= link_to "Your profile", current_profile_path %>
<%= link_to "#{@profile.name}'s profile", @profile %>
# or 
<%= link_to "#{@profile.name}'s profile", profile_path( @profile ) %>
  

Также: если Profile является моделью, вы

Комментарии:

1. К сожалению, похоже, что это создает URL /current_profile вместо /profile , если я чего-то не упускаю. Но я предполагаю, что это единственный способ решить эту проблему?