如何根据数据库数据使一个Rails 3路由与2个控制器一起工作?

时间:2011-09-29 13:11:39

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

我正在Heroku上开发一个Rails 3应用程序,情况如下:

有两种型号:用户和应用程序。两者都有“slu”“,可以通过相同的URL访问:

/蛞蝓

示例:

/ myuser => “用户#显示” / myapp => '应用#秀'

处理此问题的最佳做法是什么?我应该实施什么干净的解决方案?

你可以在AngelList上看到相同的逻辑。例如,我的个人资料为http://angel.co/martynasjocius,我的应用可以在http://angel.co/metricious找到。

谢谢!

2 个答案:

答案 0 :(得分:2)

我会考虑引入第三个模型,在示例中将其称为Lookup,但您可能希望找到更好的名称。我还假设您的用户和应用程序模型还定义了一个名称字段。

class Lookup < ActiveRecord::Base
  belongs_to :owner, :polymorphic =>  true
  validates_uniqueness_of :name   
end

class User < Active::Record::Base
  has_a :lookup, :as => :owner, :validate => true
  before_create :create_lookup_record

  def create_lookup_record
    build_lookup(:name => name)
  end
end

class App < Active::Record::Base
  has_a :lookup, :as => :owner, :validate => true
  before_create :create_lookup_record

  def create_lookup_record
    build_lookup(:name => name)
  end
end

LookupsController < ApplicationController

  def show
    @lookup = Lookup.find_by_name(params[:id])
    render :action => "#{@lookup.owner.class.name.pluralize}/show"
  end

end

# routes.rb
resources :lookups

我希望这个想法有所帮助,抱歉,如果它没用:)

答案 1 :(得分:0)

试试这个(用action代替您的行为,例如showedit等):

class SlugsController < ApplicationController
  def action
    @object = Slug.find_by_name(params[:slug]).object # or something
    self.send :"#{@object.class.to_s.downcase}_action"
  end

  protected
  def app_action
    # whatever
  end

  def user_action
    # something
  end
end

根据需要将东西分成模块。你可以让每个类的对象都有自己的行动。