Ruby on Rails: как передать параметры из представления в контроллер с помощью link_to без параметров, отображаемых в URL-адресе
В настоящее время я использую помощник link_to в представлении для передачи параметров, таких как title, author, image_url и isbn, обратно в контроллер
<%= link_to 'Sell this item',new_item_path(:title => title, :author => authors, :image_url=>image, :image_url_s=>image_s, :isbn=>isbn, :isbn13=>isbn13 ) %>
Затем контроллер назначит параметры объекту, который будет использоваться формой в представлении позже (в new.html.erb)
def new
@item = Item.new
@item.title = params[:title]
@item.author = params[:author]
@item.image_url = params[:image_url]
@item.image_url_s = params[:image_url_s]
@item.isbn = params[:isbn]
@item.isbn13 = params[:isbn13]
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @item }
end
end
Затем вызывается
new.html.erb.
Это все работает нормально, но в url отображаются все параметры
http://localhost:3000/items/new?author=Michael+Harvey&image_url=http://ecx.images-amazon.com/images/I/51vt1uVjvLL._SL160_.jpg&image_url_s=http://ecx.images-amazon.com/images/I/51vt1uVjvLL._SL75_.jpg&isbn13=9780307272508&isbn=0307272508&title=The+Third+Rail
Есть ли способ, чтобы параметры не отображались в URL?
Ответы
Ответ 1
Возможно, вы можете кодировать параметры и декодировать их в контроллере, чтобы удержать пользователей, которые могут захотеть изменить URL-адрес? Может быть, слишком много, но...
>> author=ActiveSupport::Base64.encode64("author=jim")
=> "YXV0aG9yPWppbQ==\n"
>> ActiveSupport::Base64.decode64(author)
=> "author=jim"
Ответ 2
POST может использоваться для перемещения параметров из URL-адреса и запроса, но это не "правильная" или лучшая практика. Стандарты HTTP таковы, что запросы без GET предназначены для использования только для запросов, которые изменяют состояние на сервере. Вот почему вы получаете предупреждение при обновлении страницы, созданной в ответ на POST.
В URL-адресе нет ничего плохого. Так много внимания не должно делаться на том, что появляется в строке URL, не говоря уже о том, что после ". Если, однако, у вас есть потребность (например, настойчивость клиента), чтобы удалить их, у вас есть несколько вариантов, два из которых упоминается в нем.
Я предполагаю, что ваше "новое" действие - это стиль REST, поскольку он генерирует форму, которая должна быть отправлена для изменения состояния на сервере. Поэтому ваши варианты могут быть:
- Используйте POST, даже если он не соответствует стандарту. Не рекомендуется.
- Используйте AJAX GET. Для этого требуется javascript, и обработка ajax добавляет такие требования, как использование инфраструктуры JS и тестирование.
- Используйте GET (или POST), но запишите параметры и сохраните их, перенаправив пользователя обратно на другой чистый URL-адрес, который отображает сохраненное значение. Вы можете сохранить их в хэше сеанса или создать запись в базе данных. Фактически, вы действительно должны использовать POST в этом случае, так как вы эффективно меняете состояние на сервере, сохраняя эти параметры. В этом случае, если пользователь обновляет страницу, на которую он направлен, эти параметры будут сохранены. Это эффективно удаляет предупреждение браузера при обновлении, что я, безусловно, могу вам признаться.
Ответ 3
Есть два варианта, которые я вижу, и оба включают JavaScript:
- Введите ссылку для заполнения скрытых полей формы для параметров, а затем отправьте форму с помощью запроса HTTP POST
- Попросите ссылку отправить запрос AJAX на действие контроллера (используя HTTP GET, если не щелкнуть ссылку на серверное состояние, и в этом случае следует использовать POST)
Я думаю, что пойдет со вторым подходом.
Ответ 4
Почему бы не записать их на сеанс? Похоже, что у вас может быть менее 4 тыс. Данных. Просто не забудьте стереть его.