[Rails] 액세스한 도메인을 통해 표시되는 데이터를 구분하고자 합니다.

4699 단어 powRubyRails
  • Rails 5.0.0.1
  • Ruby 2.3.1p112
  • 데이터베이스 구조가 이럴 때

  • 사이트 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.rb
    class 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
  • 되다
    나는 더 좋은 방법이 있다고 생각한다.

    참고 자료

    좋은 웹페이지 즐겨찾기