Это зависит. Вы передаете хешу данных в модель и говорите «имейте это в виду».
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 ), чтобы гарантировать, что модель принимает только действительные данные.
Извините за длинный ответ, но у меня нет времени написать более короткий ответ;).