Пропускает ли передача параметров из контроллера в модель MVC? - PullRequest
3 голосов
/ 05 декабря 2008

Я хочу передать коллекцию параметров из контроллера в модель для анализа условий фильтрации и сортировки. Имеет ли метод в модели, который получает параметры из контроллера, разрыв MVC?

Ответы [ 4 ]

4 голосов
/ 05 декабря 2008

Это зависит. Вы передаете хешу данных в модель и говорите «имейте это в виду».

class Model < ActiveRecord::Base
  def update_from_params(params)
    ....
  end
end

class ModelsController < ActionController::Base
  def update
    ...
    @model.update_from_params(params)
  end
end

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

class Model < ActiveRecord::Base
  def update_from_update_params(params)
    # do stuff
  end

  def update_from_settings_params(params)
    # do different stuff
  end

end

class ModelsController < ActionController::Base
  def update
    ...
    @model.update_from_update_params(params)
  end

  def change_settings
    ...
    @model.update_from_settings_params(params)
  end
end

Это не нормально, и вы заставляете модель работать с контроллером. Разумный подход - создать в вашей модели метод, который принимает канонический хэш данных, а затем переводить между параметрами и каноническим хешем в контроллере:

class Model < ActiveRecord::Base
  def update_from_data(hash)
    validate_data!(hash)
    # do stuff
  end
end

class ModelsController < ActionController::Base
  def update
    ...
    @model.update_from_data(translate_update_params)
  end

  def change_settings
    ...
    @model.update_from_data(translate_change_settings_params)
  end
end

Хотя вы должны тщательно документировать формат хэша данных, который принимает модель. На самом деле мы зашли так далеко, что использовали библиотеку проверки YAML ( Rx ), чтобы гарантировать, что модель принимает только действительные данные.

Извините за длинный ответ, но у меня нет времени написать более короткий ответ;).

1 голос
/ 27 мая 2009

Я бы предложил передать поднабор параметров, таким образом, вы передаете только то, что нужно модели.

В контроллере:

# in controller
def search
  Model.search(params[:search][:options])
end

Просто убедитесь, что ваши входы «пространством имен», чтобы вы получили вложенный хеш:

<!-- in view -->
<input type='text' name='search[options][keywords]' />
<input type='text' name='search[options][conditions]' />
<input type='text' name='search[options][sort]' />

Тогда в вашей модели:

def self.do_search(criteria)

        Rental.search(criteria[:keywords], 
                      :per_page => self.per_page,
                      :page => page,
                      :conditions => criteria[:conditions],
                      :order => criteria[:sort])

end
1 голос
/ 05 декабря 2008

Я бы сказал, что определенно.

В хэше params есть много вещей, которые не нужны вашим моделям. В основном вы игнорируете C часть MVC. То, что вы хотите сделать, будет работать (иначе оно выполнится) Но я думаю, что вы должны передать параметры как отдельные объекты.

0 голосов
/ 05 декабря 2008

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

В любом случае, я думаю, вам все равно нужно будет отправлять параметры через контроллер, так почему бы не выполнить там свою обработку, а затем отправить обработанные данные в модель с помощью метода модели?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...