Rails 3 - передача user.id в скрытом поле формы против использования ассоциации - PullRequest
6 голосов
/ 13 мая 2011

Хорошо, поэтому в настоящее время у меня есть форма

<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

Вопрос: безопаснее ли (чтобы форма не изменялась) делать что-то подобное в методе создания?

@user = current_user
@app = @user.apps.create(params[:app])

Если это так ... как именно мне поступить с реализацией приведенного выше кода (это не синтаксически правильно ... просто псевдо)?

Спасибо!

Ответы [ 3 ]

9 голосов
/ 13 мая 2011

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

@user = current_user
@app = @user.apps.create(params[:app])

Также убедитесь, что вы защищаете себя от массового назначения, прочитайте это http://stephensclafani.com/2010/01/04/ruby-on-rails-secure-mass-assignment/

4 голосов
/ 13 мая 2011

Абсолютно безопаснее сделать это вторым способом. Если вы делаете это первым способом, вы доверяете клиенту утверждать, кто он. Любой может легко изменить форму (с помощью firebug или вручную отправить запрос POST со многими инструментами) и в итоге отправить форму с current_user другого человека.

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

1 голос
/ 13 мая 2011

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

Способ, которым вы устанавливаете это с помощью маршрутов:

resources :users do
  resources :apps
end

Это даст вам такие пути, как user_app_path и new_user_app_path , которым вы передаете идентификатор пользователя и идентификатор приложения или нового приложения.

Надеюсь, это поможет

...