#ruby-on-rails #select
#ruby-on-rails #выберите
Вопрос:
Я использую Ruby on Rails версии 3. Я определил следующий вспомогательный метод для селектора:
def current_user_selector
collection_select(:user, :id, User.all, :id, :name, {:prompt => "Select a User"});
end
Я ввел вышеупомянутый селектор в моем index.html.erb
:
...
<%= current_user_selector %>
...
Я где-то читал, что к выбранной опции из выпадающего меню можно получить доступ в контроллере с помощью:
selected_user = params[user][id]
Я добавил вышеупомянутую строку в несколько действий моего контроллера, но я продолжаю получать исключения.
В настоящее время у меня есть это в следующем действии:
# GET /users/:id/click
# GET /users/:id/click.xml
def click
@user = User.find(params[:id])
@users_to_click = User.where("clicks_given - clicks_received >= ?", -5).order("clicks_given - clicks_received")
selected_user = params[user][id]
respond_to do |format|
format.html # click.html.erb
format.xml { render :xml => @user }
end
end
Мой вопрос в том, как и я получаю выбранного пользователя из выпадающего меню.
Нарен Сисодия привел меня к следующему исключению:
You have a nil object when you didn't expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.[]
Комментарии:
1. можете ли вы поместить форму туда, где вы используете выпадающий список?
2. Выпадающее меню отображается в
index.html.erb
. Это в вопросе.
Ответ №1:
параметры [:user] [:id] выдадут вам идентификатор выбранного пользователя, поэтому вам нужно найти пользователя по этому идентификатору.
selected_user = User.find(params[:user][:id])
Редактировать:
также убедитесь, что вы обращаетесь к нему как params[:user] [:id] вместо params[user][id]
Обновить:
вам нужно передать выбранное значение на сервер, как вы упомянули, у вас есть кнопка, которая вызывает действие щелчка. Теперь вы можете создать из с помощью выпадающего списка и одной кнопки отправки; что-то вроде
<%= form_tag('/click',:method=>'get') do -%>
<%= current_user_selector %>
<%= submit_tag 'Get Selected' %>
<% end -%>
Комментарии:
1. Это не сработало. Возвращаемую ошибку смотрите в моем вопросе выше.
2. Если ваш выпадающий список отображается в индексном файле, то как вы передаете его выбранное значение на сервер? вам нужно передать его на сервер. и когда вызывается ваше действие click?
3. В индексном файле у меня есть кнопка, которая вызывает действие щелчка. Как мне передать выбранное значение на сервер?
4. вы можете создать форму, которая включает выпадающий список и вашу кнопку, кнопка будет кнопкой отправки формы. Действие формы должно соответствовать вашему действию щелчка.
5. Это снова я, разве нельзя было бы сгенерировать выпадающее меню с помощью JS и получить выбранного пользователя с помощью JS? Избегание отправки формы. Это потому, что текущий пользователь также используется другим пользователем, который вызывает действие щелчка. Я загрузил свое приложение на github ( github.com/TiagoVeloso/clicker/tree/master/app ) таким образом, вы можете видеть, что используется.