[Rails] 액세스한 도메인을 통해 표시되는 데이터를 구분하고자 합니다.
사이트 A 방문 시 상품 1과 상품 2만 표시
사이트 B 방문 시 상품만 표시3
모델에서 Request 정보를 가져올 수 있도록 허용
application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_filter :set_request_filter # 追記
# 追記
def set_request_filter
Thread.current[:request] = request
end
end
컨트롤러를 통해 Request 객체를 가져오고 Thread를 읽습니다.current에 넣을게요.이게 바로 모델에 있는 Theread입니다.current[:request]에서 request를 참조할 수 있습니다.
추가 scope
site.rb
class Site < ApplicationRecord
has_many :items
# ドメイン名に domain カラムのキーワードが存在するデータを取得
scope :by_domain, lambda { |domain|
where("? LIKE CONCAT('%', domain, '%')", domain)
}
end
item.rbclass Item < ApplicationRecord
belongs_to :site
# request.host でドメイン名を取得し、Site.by_domain の引数に渡す
default_scope lambda {
request = Thread.current[:request]
return all unless request
joins(:site).merge(Site.by_domain(request.host))
}
end
Item 인스턴스 선언 시 가져올 데이터를 제한하려면defaultscope로 실현하다확인
데이터를 적절히 작성하다.
> site_a = Site.create(name: 'サイトA', domain: 'aaa') # domain はドメイン名に含まれる文字列を指定
> site_b = Site.create(name: 'サイトB', domain: 'bbb') # 上記と同様
> site_a.items.create(name: '商品1')
> site_a.items.create(name: '商品2')
> site_b.items.create(name: '商品3')
이번 사용pow을 검증했다.$ cd ~/.pow
$ ln -s ~/workspace/demo aaa
$ ln -s ~/workspace/demo bbb
도메인 이름은 웹 사이트 Aaaa
, 웹 사이트 B:bbb
로 설정합니다.또한 Item 모델은 사전에 scaffold
방문해 보다
http://aaa.dev/items
http://bbb.dev/items
사이트 A 방문 시 상품 1과 상품 2만 표시
사이트 B 방문 시 상품만 표시3
나는 더 좋은 방법이 있다고 생각한다.
참고 자료
Reference
이 문제에 관하여([Rails] 액세스한 도메인을 통해 표시되는 데이터를 구분하고자 합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/u9r52sld/items/a2da84be9c7f65da01c7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)