Сохранение переменной экземпляра в качестве переменной экземпляра, а не ее содержимого - PullRequest
1 голос
/ 24 февраля 2012

У меня есть только смутное представление об этом, поэтому при необходимости задайте вопрос:

У меня есть набор значений, которые я регулярно передаю в своем контроллере rails виджету, который немного отличается от страницы к странице, от того, что я передаю ему. Это начинает становиться громоздким для каждого контроллера, поэтому я добавил небольшой класс, чтобы немного объединить этот процесс (базовая начальная суть ниже).

#return dashcontroller hash from more succinct cues
module DashControl
  class DashControl

    attr_accessor :title, :instance, :actions 

    def initialize(title='default title', instance='default instance', actions={})
      @title = title
      @instance = instance
      initialize_actions(actions)
    end

    def initialize_actions(actions)
      actions.kind_of?(Hash) ? @actions = actions : initialize_tag(actions)
    end

    def initialize_tag(tag)
      case tag
      when :manage_default
        @actions = {:statusactions => [], 
                    :formactions => [ ['#tabaccount', 'addaccount'],
                                      ['#tabuser', 'addusers'],
                                      ['#tabadd','adddomain'] ],
                    :linkactions => [ [] ],
                    :filteractions => [ [] ] }
      when :none 
        @actions = {}
      #when 
      #  @actions = {}
      else
        @actions = @actions
      end
    end  


    def dashcontroller
      {:title => @title, :instance => @instance, :actions => @actions }
    end

  end
end

Так что в основном мне просто нужно передать экземпляр this.dashcontroller, и я получаю хэш, который мне нужен, с гораздо меньшим количеством хаоса в моих контроллерах. Проблема связана с переменной @instance. Я хочу передать экземпляр, который я использую, например. @book, @account и т. Д., И я получаю это как @book, @account и т. Д. Вместо этого я получаю содержимое того, что я туда положил, как :instance => (contents of that instance). Это не кажется мне правильным, как прежде, чем я просто использовал, например, @account, а затем использовать это, но, глядя на него, может не иметь никакого значения в виджете, так как я манипулирую вещами и работаю над своим кодом-фу.

По сути, мой вопрос заключается в том, как протолкнуть переменную экземпляра через такой класс, и при этом иметь доступ к ней по мере ее появления без необходимости каких-либо откатов и преобразований на другой стороне. Возможно, есть лучший способ, но сейчас я работаю над этим.

редактировать: псевдокод

DashControl::DashControl.new("Catchy Title", @book, :none).dashcontroller
#=> {:title => "Catchy Title", :instance => @book, :actions => {} }

Я думаю, что могу работать с ним, как я уже сказал, это больше вопрос моего понимания того, как все происходит, чем реальная ошибка или что-то сложное. Я хотел бы не делать больше гимнастики на другом конце с материалом экземпляра, хотя содержание там есть, и это все, что мне действительно нужно, мне просто нужно немного подумать, чтобы это было меньше беспорядка. Мне действительно нужно уточнить то, что я отправляю через это, или использовать это, чтобы уточнить то, что я посылаю, - это урок, который нужно забрать прямо сейчас.

редактирование:

В итоге я бросил это, но это был опыт обучения ... Я вернулся к виджету и знаю больше, чем когда я изначально настраивал виджет, так что я смог настроить его так, чтобы он занимал только переменная экземпляра и начальная загрузка того, что ему нужно, без добавления другого класса, очистки моих контроллеров и передачи большого количества данных обратно в виджет, где я подозреваю, что это должно было / могло начаться.

1 Ответ

0 голосов
/ 24 февраля 2012

На основании вашего кода и примера это подходит:

# No need to put a class in a namespace of the same name, just make the module a class
# Also, if you inherit from a struct, it can save you a lot of typing. It defines the setters and getters for you.
class DashControl < Struct.new(:title, :instance, :actions)

  # since it looks like you always access it the same way, create a class method
  # which does this initialization and invocation
  def self.for(*args)
    new(*args).dashcontroller
  end

  def initialize(title='default title', instance='default instance', actions=:none)
    # here, we can use our own defaults and normalization and pass the results up to the struct
    super title, instance, normalize(actions)
  end

  # didn't make sense to call this initialize_tag, as it was initializing actions
  # also there was already an initialize actions method which just checked for the case of a hash
  # but then elsewhere you checked for other things. Better to just put it all in one method and return it
  # (then you aren't setting it every time you want to ask it to calculate that value)
  # also using guard clauses (the if statements that return early) instead of the case, as they are easier to understand
  def normalize(actions)
    return Hash.new if actions == :none
    return actions unless actions == :manage_default
    default_actions
  end  

  # the value of default_actions is complicated and noisy, separate it out to its own method
  # this prevents it from cluttering the code around it, and also allows us to access,
  # and to do this without the side effects of setting values.
  def default_actions
    { :statusactions => [], 
      :formactions   => [ ['#tabaccount', 'addaccount'],
                          ['#tabuser', 'addusers'],
                          ['#tabadd','adddomain'] ],
      :linkactions   => [ [] ],
      :filteractions => [ [] ] }
  end

  # use the getters instead of the ivars (I consider this a generally best practice -- and you could have
  # done it before, since you declared the attr_accessor, even though I'm accessing it through the struct)
  def dashcontroller
    {:title => title, :instance => instance, :actions => actions }
  end
end

DashControl.for                                           # => {:title=>"default title", :instance=>"default instance", :actions=>{}}
DashControl.for('Catchy Title', '@book', :none)           # => {:title=>"Catchy Title", :instance=>"@book", :actions=>{}}
DashControl.for('Catchy Title', '@book', :manage_default) # => {:title=>"Catchy Title", :instance=>"@book", :actions=>{:statusactions=>[], :formactions=>[["#tabaccount", "addaccount"], ["#tabuser", "addusers"], ["#tabadd", "adddomain"]], :linkactions=>[[]], :filteractions=>[[]]}}
DashControl.for('Catchy Title', '@book', a: 'b')          # => {:title=>"Catchy Title", :instance=>"@book", :actions=>{:a=>"b"}}
DashControl.for('Catchy Title', '@book', 123)             # => {:title=>"Catchy Title", :instance=>"@book", :actions=>123}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...