Ruby on Rails: как передать параметры из представления в контроллер с link_to без отображения параметров в URL - PullRequest
12 голосов
/ 07 сентября 2010

В настоящее время я использую помощника link_to в View для передачи параметров, таких как 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?

Ответы [ 4 ]

7 голосов
/ 13 декабря 2010

Может быть, вы могли бы закодировать параметры и декодировать их в контроллере, чтобы удержать пользователей, которые могут захотеть изменить URL-адрес? Может быть излишним, но ...

>> author=ActiveSupport::Base64.encode64("author=jim")
=> "YXV0aG9yPWppbQ==\n"
>> ActiveSupport::Base64.decode64(author)
=> "author=jim"
4 голосов
/ 07 сентября 2010

POST может использоваться для перемещения параметров из URL-адреса в запрос, но это не «правильный» и не лучший метод.Стандарты HTTP таковы, что запросы не GET предназначены для использования только для запросов, которые изменяют состояние на сервере.Вот почему вы получаете предупреждение, когда обновляете страницу, сгенерированную в ответ на запрос POST.

Нет ничего плохого в наличии параметров в URL.Так много внимания не следует уделять тому, что отображается в строке URL, не говоря уже о том, что после?Однако если у вас есть какая-то необходимость (например, настойчивость клиента) для их удаления, у вас есть несколько вариантов, два из которых Джон упоминает.

Я предполагаю, что ваше «новое» действие выполнено в стиле REST, в этомон генерирует форму, которую необходимо отправить для изменения состояния на сервере.Поэтому ваши варианты могут быть:

  1. Использовать POST, даже если он не соответствует стандарту.Не рекомендуется.
  2. Использовать AJAX GET.Это требует javascript, а обработка ajax добавляет такие требования, как использование JS-фреймворка и тестирование.
  3. Используйте GET (или POST), но собирайте параметры и сохраняйте их, перенаправляйте пользователя обратно в другое чистое состояние.URL, который отображает эти сохраненные значения.Вы можете сохранить их в хеше сеанса или создать их запись в базе данных.На самом деле вам действительно следует использовать POST в этом случае, поскольку вы эффективно изменяете состояние на сервере, сохраняя эти параметры.В этом случае, если пользователь обновит страницу, на которую он направлен, эти параметры будут сохранены.Это эффективно удаляет предупреждение браузера при обновлении, что я, безусловно, могу оценить.
2 голосов
/ 07 сентября 2010

Есть два варианта, которые я вижу, и оба включают JavaScript:

  • Сделайте так, чтобы ссылка заполняла скрытые поля формы для параметров, а затем отправляла форму, используя HTTP-запрос POST
  • Пусть ссылка отправит AJAX-запрос к действию контроллера (используя HTTP-запрос GET, если щелчок по ссылке не изменит состояние на стороне сервера, в этом случае следует использовать POST)

Я думаю, я бы пошелсо вторым подходом.

0 голосов
/ 30 августа 2013

Почему бы не записать их в сессию?Похоже, у вас там может быть меньше 4 тыс. Данных.Просто не забудьте стереть его.

...