Rails 3 - передача user.id в скрытом поле формы против использования ассоциации
Хорошо, так что в настоящее время у меня есть форма
<div class="field">
<%= f.label :title %><br/>
<%= f.text_field :title %><br/>
<%= f.label :itunesurl %><br />
<%= f.text_field :itunesurl %><br />
<%= f.hidden_field :user_id, :value => current_user.id %>
</div>
<div class="actions">
<%= f.submit %>
</div>
Который передает current_user.id в метод create моей модели "app", который создает его следующим образом перед сохранением:
@app = App.new(params[:app])
Однако у меня есть ассоциации (псевдокод)
user has_many apps
apps belongs_to user
Вопрос: безопаснее (чтобы форма не изменялась) делать что-то подобное в методе create?
@user = current_user
@app = @user.apps.create(params[:app])
Если это так... как именно я мог бы на самом деле реализовать код выше (это не синтаксически правильно.. просто псевдо)?
Спасибо!
3 ответа
Да, использование второго способа, который вы предложили, является лучшим подходом
@user = current_user
@app = @user.apps.create(params[:app])
Также убедитесь, что вы защищаете себя от массовых заданий, прочитайте это http://stephensclafani.com/2010/01/04/ruby-on-rails-secure-mass-assignment/
Совершенно безопаснее сделать это вторым способом. Если вы делаете это первым способом, вы доверяете клиенту утверждать, кто он. Любой может легко изменить форму (с помощью firebug, или они могут вручную отправить POST
запрос со многими инструментами) и в конечном итоге отправить форму с current_user
другого человека.
Убедитесь, что вы применяете это мышление повсюду в приложении. Не доверяйте ничему, что клиент представляет, никогда.
Второй фрагмент кода более "RESTful", чем первый. Под RESTful я имею в виду, что если приложение является ресурсом, к которому логически осуществляется доступ через пользователя, то его обязательно используют.
То, как вы устанавливаете это через маршруты:
resources :users do
resources :apps
end
Это даст вам пути, такие как user_app_path и new_user_app_path, которым вы передаете идентификатор пользователя и идентификатор приложения или нового приложения.
Надеюсь это поможет