12

現在のユーザーを識別するためにタグ付けされたアフィリエイト リンクのリストを出力したいと考えています。HTML では単純ですが、API を作成しているので、出力は JSON です。

動作していますが、複雑すぎるようです。これは最善のアプローチですか?

私のモデルである AffiliateLink には、トークンを追加することでオンザフライで変換および出力するフィールド (リンクの生の HTML) が含まれています。置換を生成するモデル メソッドがあります。複数のアフィリエイトを使用し、それぞれにこのメソッドが認識している特別な変換ルールがあるため、自明ではありません。

def link_with_token(user_token)
  # some gnarly code that depends on a lot of stuff the model knows
  # that returns a proper link
end

JSON で正しいリンク html を取得するために、次のことを行いました。

  • attr_accessor :link_htmlモデルに追加
  • インスタンスメソッドを追加して、新しいアクセサーを設定します

...

def set_link_html(token)
  self.link_html = link_with_tracking_token(token)
end
  • モデルでオーバーライドas_jsonし、元の html_code を link_html に置き換えます

...

def as_json(options = {})
  super(:methods => :link_html, :except => :html_code)
end
  • コントローラ メソッドで返されたコレクションを反復処理して、変換を行います

...

def index
  @links = Admin::AffiliateLink.all  # TODO, pagination, etc.

  respond_to do |format|
    format.html # index.html.erb
    format.json do
      @links.each do |link|
        link.set_link_html(account_tracking_token)
      end
      render json: @links
    end
  end
end

これは、私の十代の若者の変身を成し遂げるためだけにやるべきことがたくさんあるようです. 役に立つ提案 (この問題に関するものであり、現在流動的なコードの他の側面に関するものではありません) を歓迎します。

4

1 に答える 1

18

1)問題の簡単な解決策(ここに示されているように):

affiliate_links_controller.rb

def index
  @links = Admin::AffiliateLink.all  # TODO, pagination, etc.

  respond_to do |format|
    format.html # index.html.erb
    format.json do
      render json: @links.to_json(:account_tracking_token => account_tracking_token)
    end
  end
end

AffiliateLink.rb

# I advocate reverse_merge so passed-in options overwrite defaults when option
# keys match.
def as_json(options = {})
  json = super(options.reverse_merge(:except => :html_code))
  json[:link_with_token] = link_with_token(options[:account_tracking_token])
  json
end

2)実際に API を作成している場合は、よりハードコアなソリューション:

  1. 問題を説明しているこの記事を参照してください。
  2. 著者が解決策として作成した宝石を参照してください。
  3. gem の使用については、この Railscastを参照してください。

3)そして最後に、便利なソリューションです。便利なモデル関係がある場合、これはきれいです:

AffiliateLink のふりをしてbelongs_to :userいます。また、user_token が User のアクセス可能な属性であると仮定します。

AffiliateLink.rb

# have access to user.user_token via relation
def link_with_token
  # some gnarly code that depends on a lot of stuff the model knows
  # that returns a proper link
end

def as_json(options = {})
  super(options.reverse_merge(:methods => :link_with_token, :except => :html_code))
end

affiliate_links_controller.rb

def index
  @links = Admin::AffiliateLink.all  # TODO, pagination, etc.

  respond_to do |format|
    format.html # index.html.erb
    format.json do
      render json: @links
    end
  end
end
于 2012-08-26T04:09:08.643 に答える