Рельсы 3 формы и модели - PullRequest
1 голос
/ 18 марта 2011

Я из мира Asp.Net MVC, и меня смущает, как подходить к формам Rails 3 с точки зрения модели. В Asp.Net MVC плохая практика - привязывать формы бизнес-модели в шаблонах. Надлежащий подход заключается в создании класса для каждой формы, создании свойств, которые необходимы только в форме, и присоединении к ним атрибутов проверки. Затем в коде проверьте ModelState.IsValid и присвойте значения из модели формы бизнес-модели. Это приводит к разделению понятий, а также предотвращает угон свойств (когда хакеры могут жестоко размещать дополнительные значения вместе с правильными значениями и изменять свойства бизнес-модели).

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

Это правильный подход в Rails 3, и я должен следовать ему? Или я должен следовать подходу Asp .Net MVC и создать отдельную модель с проверкой только для форм?

1 Ответ

0 голосов
/ 18 марта 2011

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

Model.update_attributes(params[:model])

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

params[:model][:users_attributes][:email] = 'hacker@example.com'` 

и обновит адрес электронной почты ассоциированного пользователя модели?

В Asp.Net MVC кажется, что вы просто не допускаете этого в шаблоне формы, и значение никогда не попадет в ваши модели, но в рельсах это не так, как это делается (поправьте меня, еслиЯ неправильно понимаю Asp.Net MVC).В Rails все в модели (по умолчанию) может быть назначено по массе, поэтому ваш страх оправдан.

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

class User < ActiveRecord::Base
  attr_accessible :login, :password
end

Это означает, что любые другие свойства должны быть установлены вручную и объект должен быть сохранен, что предотвращает тот же тип захвата свойств, от которого защищаются шаблоны форм Asp.Net.В Rails все, что должно быть назначено по массе, должно быть в вашем attr_accessible, и тогда ActiveRecord является привратником.Независимо от того, как написаны ваши формы или что хакер делает с их HTML, эти атрибуты могут быть явно обновлены только вашим кодом, а не скрытыми вещами Rails.

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