我正在Heroku上开发一个Rails 3应用程序,情况如下:
有两种型号:用户和应用程序。两者都有“slu”“,可以通过相同的URL访问:
/蛞蝓
示例:
/ myuser => “用户#显示” / myapp => '应用#秀'
处理此问题的最佳做法是什么?我应该实施什么干净的解决方案?
你可以在AngelList上看到相同的逻辑。例如,我的个人资料为http://angel.co/martynasjocius,我的应用可以在http://angel.co/metricious找到。
谢谢!
答案 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
代替您的行为,例如show
,edit
等):
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
根据需要将东西分成模块。你可以让每个类的对象都有自己的行动。