为资源(单数)和资源(复数)创建Rails路由的最佳方法是什么?

时间:2011-05-08 07:25:14

标签: ruby-on-rails ruby-on-rails-3 routing routes

我的应用程序中有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 / ID参数的情况下调用profile_path,这意味着每当我需要链接时,我都必须使用字符串'/ profile'。

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

1 个答案:

答案 0 :(得分:2)

您的路线:

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 ) %>

另外:如果个人资料是模特,那么