Как отправить user.id с: user в params, хотя user.name - это то, что находится в выпадающем списке? - PullRequest
0 голосов
/ 26 июля 2011

В настоящее время в контроллере клиентов есть действие, генерирующее массив имен @username_array всех объектов класса User, с помощью которого можно заполнить раскрывающееся меню в форме, которая создает новый объект класса Customer.Элемент формы выглядит следующим образом:

<%= f.select :user_id, @username_array %>

Мне бы очень хотелось, чтобы id пользователя было отправлено в params [: customer] [: user_id] вместо name того пользователя, который выбран в раскрывающемся списке.Таким образом, в моем действии create на контроллере клиентов есть следующий код:

@customer = Customer.new(params[:customer])
@user = User.find_by_name(params[:customer][:user_id]) # where :user_id is actually currently the name selected from the drop down
@customer.user_id = @user.id

Есть ли более простой способ сделать это?

Ответы [ 2 ]

1 голос
/ 26 июля 2011

Измените @ username_array , указав имя и идентификатор пользователя:

Вместо:

["Bob","Sally","Dave"]

Сделайте это:

[["Bob", 1],["Sally",2],["Dave",3]]

Это может быть выполнено примерно так:

@username_array = User.all.map {|user| [user.name, user.id]}

Затем f.select отобразит имя в раскрывающемся списке, но фактическое значение будет передано через params [: customer] [:user_id] будет идентификатором пользователя, который вы хотите.После этого все, что вам нужно в коде действия контроллера, это:

@customer = Customer.new(params[:customer])

Вам не придется искать пользователя по имени, хэш params уже будет иметь правильное значение идентификатора.

Обратите внимание, что вместо того, чтобы сделать @username_array переменной экземпляра, вы можете просто создать вспомогательный метод в помощнике для этого контроллера или помощник приложения:

def user_select
  User.all.map {|user| [user.name, user.id]}
end

Затем, на ваш взгляд:

<%= f.select :user_id, user_select %>

Если вы поместите это в свой помощник приложения, вы можете использовать его везде и иметь код только в одном месте (СУХОЙ).

0 голосов
/ 26 июля 2011

вы можете сделать

@user = User.find_by_name(params[:customer][:user_id])
@user.customers.new(params[:customer])

или

@user = User.find_by_name(params[:customer][:user_id])
@customer = @user.customers.create(params[:customer])

, но для этого вы должны иметь отношение (has_many, own_to, ...)

или

Customer.new(params[:customer], :user_id => params[:customer][:user_id])

или

f.collection_select :user_id, @username_array, :id, :name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...