Override کردن متغییرهای یک کلاس


#1

من این کلاس رو در اختیار دارم برای ارسال مطلب در توییتر هست ، بعد توی کامت نوشته که این دو متغییر اول رو در فایل production.rb
override کن.
چطور این کار رو انجام بدم ؟

class Twitter
  cattr_accessor :CONSUMER_KEY, :CONSUMER_SECRET, :AUTH_TOKEN, :AUTH_SECRET

  # these need to be overridden in config/initializers/production.rb
  @@CONSUMER_KEY = "Xxxxxxxxxxxxxxxx"
  @@CONSUMER_SECRET = "ddddddjdjdjdjdjdjjdjdjdjdjdj"


  #  (needs read/write access)
  @@AUTH_TOKEN = "djdjdjdjdjd-jdjdjdjdddkdkdk"
  @@AUTH_SECRET = "ieieieieieieieieieieieieieieieieieiieeiiee"

  MAX_TWEET_LEN = 140

  # https://t.co/eyW1U2HLtP
  TCO_LEN = 23

  def self.enabled?
    self.CONSUMER_KEY.present?
  end

  def self.oauth_consumer
    OAuth::Consumer.new(self.CONSUMER_KEY, self.CONSUMER_SECRET,
      { :site => "https://api.twitter.com" })
  end

  def self.oauth_request(req, method = :get, post_data = nil)
    if !self.AUTH_TOKEN
      raise "no auth token configured"
    end

    begin
      Timeout.timeout(120) do
        at = OAuth::AccessToken.new(self.oauth_consumer, self.AUTH_TOKEN,
          self.AUTH_SECRET)

        if method == :get
          res = at.get(req)
        elsif method == :post
          res = at.post(req, post_data)
        else
          raise "what kind of method is #{method}?"
        end

        if res.class == Net::HTTPUnauthorized
          raise "not authorized"
        end

        if res.body.to_s == ""
          raise res.inspect
        else
          return JSON.parse(res.body)
        end
      end
    end
  end

  def self.token_secret_and_user_from_token_and_verifier(tok, verifier)
    rt = OAuth::RequestToken.from_hash(self.oauth_consumer,
      { :oauth_token => tok })
    at = rt.get_access_token({ :oauth_verifier => verifier })

    res = at.get("/1.1/account/verify_credentials.json")
    js = JSON.parse(res.body)

    if !js["screen_name"].present?
      return nil
    end

    [ at.token, at.secret, js["screen_name"] ]
  end

  def self.oauth_request_token(state)
    self.oauth_consumer.get_request_token(:oauth_callback =>
      Rails.application.root_url + "settings/twitter_callback?state=#{state}")
  end

  def self.oauth_auth_url(state)
    self.oauth_request_token(state).authorize_url
  end
end


#2

اگر منظور شما اينه كلا override كردن متد چطورى انجام ميشه، خب يعنى در وارث اون كلاس متد هايى با همون اسم تعريف كن كه كمى يا كاملا با متد اصلى فرق داشته باشه و ميتونى با فراخوانى super كد اصلى رو هم فراخوانى كنى.
http://rubylearning.com/satishtalim/ruby_overriding_methods.html

اگر منظور اينه كه چه اوررايدى انجام بشه، اونو بايد درست ببينم بعد بگم.


#3

آهان ببخشيد، متغير ها رو فرمودين من اشتباه توضيح دادم
اما در مورد اين كد: در اين نوع communication براى ارتباط api و مصرف كننده api كه همون consumer باشه نياز به authentication با استفاده از secret key هست.
مقدار درست رو قرار بدين مشكل حل ميشه


#4

آخه گفته توی فایل production قرار بده:
می خواستم ببینم syntax ش چطوری میشه
مثلا ایطوری میشه ؟ :

class << Rails.twitter
  CONSUMER_KEY = "Xxxxxxxxxxxxxxxx"
  CONSUMER_SECRET = "ddddddjdjdjdjdjdjjdjdjdjdjdj"
end

#5
In general ruby:

class Foo
  @@my_class_var = 'default value'
  cattr_accessor :my_class_var
end

>>> puts Foo.my_class_var #=> "default value"

>>> Foo.my_class_var = 'hello new value!'
>>> puts Foo.my_class_var #=> "hello new value!"

#6

کلا استفاده از class variable پیشنهاد نمیشه
http://www.rubydoc.info/github/bbatsov/rubocop/Rubocop/Cop/Style/ClassVars


#7

باز هم اگر من جاى شما بودم secret key ها رو بين كد منطقى قرار نميدادم، از environment variable استفاده ميكردم، سعى كنيد تا زوده پروژه رو محكم و تميز مديريت كنيد.

http://blog.honeybadger.io/ruby-guide-environment-variables/

http://railsapps.github.io/rails-environment-variables.html


#8

چششم :slight_smile: