0

twitter でシェアする商品属性の長さに基づいてテキストを組み立てるために、このクラスを作成しました。

私の質問:

  • これは問題に取り組むための良いアプローチですか?これじゃないなら何?(クラスとメソッドをどこに置くべきか、どのように呼び出すかなど)
  • これが良いアプローチである場合、何を変更する必要がありますか? たとえば、 は にあるdef twitter_share_textべきではないと感じていますproduct.rb

show.html.erb

<a class="twitter-share" data-behavior="twitter-share" 
                         data-twittertext="<%= @product.twitter_share_text %>" 
                         data-twitterurl="<%= product_url(@product) %>" 
                         data-twitteranchor>
  <i class="fa fa-lg fa-twitter"></i>
</a>

product.rb

def twitter_share_text
  TwitterProductShare.new(self).return_text
end

アプリ/サービス/twitter_product_share.rb

class TwitterProductShare
  URL_LENGTH = 23 #defined by twitter API
  SPACE_LENGTH = 1
  TWITTER_MAX = 140
  attr_reader :name, :oneliner

  def initialize(product)
    @name = product.name
    @oneliner = product.oneliner
  end

  def return_text
    if full_length <= TWITTER_MAX
      return basic_text
    else
      return basic_text[0...-(difference + text_end.length)] + text_end
    end
  end

  private

    def basic_text
      "#{name}: #{oneliner}"
    end

    def difference
      full_length - TWITTER_MAX
    end

    def full_length
      basic_text.length + SPACE_LENGTH + URL_LENGTH
    end

    def text_end
      "..."
    end
end
4

1 に答える 1

1

そのようなコードはビューヘルパーに属していると思います:

# in app/helpers/product_helper.rb
def twitter_share_link(product)
  data = {
    behavior:      'twitter-share',
    twittertext:   TwitterProductShare.new(product).return_text,
    twitterurl:    product_url(product),
    twitteranchor: 'twitteranchor'
  }

  link_to(class: 'twitter-share', data: data) do
    tag(:i, class: 'fa fa-lg fa-twitter')
  end
end

ビューでは、このヘルパーを次のように使用します。

<%= twitter_share_link(@product) %>

dataまたは、 からハッシュ全体を返すこともできますTwitterProductShare

于 2016-06-11T13:30:20.110 に答える