#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
, если я чего-то не упускаю. Но я предполагаю, что это единственный способ решить эту проблему?