Как установить внешние ключи через ввод формы в Ruby on Rails3? - PullRequest
1 голос
/ 27 февраля 2012

В моем новом приложении Rails (это мое первое приложение!) Пользователи могут управлять своими Клиентами , а также создавать Проектов для каждого Клиента.

Users -----< Clients -----< Projects

Чтобы создать новый Проект для Клиента , пользователь должен выбрать Клиента в поле выбора следующим образом:

<%= f.label :client_id %>
<% options = current_user.clients.all.map { |client| [client.name, client.id] } %>
<%= f.select(:client_id, options) %>

Мое действие контроллера выглядит так:

client = current_user.clients.find(params[:project][:client_id])
@project = client.projects.build(params[:project])

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

attr_accessible :name, :client_id

Так это недостаток безопасности? Я не хочу, чтобы кто-нибудь вмешивался в эти внешние ключи. Есть ли более безопасный способ установки внешних ключей в Rails?

1 Ответ

1 голос
/ 27 февраля 2012

Так что в Rails есть куча отличных помощников для подобных вещей.Проверьте это:

http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-options_from_collection_for_select

Этот метод будет генерировать то, что вы ищете.Чтобы ответить на ваш вопрос, никто не может подделать эти идентификаторы.

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

Вот как бы я поступил так, как вы:

<%= f.select :client_id, options_from_collection_for_select(current_user.clients.all, 'id', 'name') %>

Методы сначала собирают коллекцию (в вашем случае этоcurrent_user.clients.all), затем атрибут для значения опции (в вашем случае идентификатор), затем он принимает атрибут метки (в вашем случае имя клиента)

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

...