Как я могу скрыть параметры, которые я передаю в метод (как, кажется, делает form_for)? - PullRequest
1 голос
/ 19 декабря 2009

Я искал часы и не нашел ничего, что могло бы помочь.

Что я хочу сделать:

Мне нужно вызвать check_login -метод (как показано ниже), для которого нужны параметры.

redirect_to check_login_users_url(
  :user => {:name => input[1], :password => input [2] },
  :stylesheet => 'scaffold',
  :method => :get)

Дело в том, что эти параметры отправляются в вызове метода, как в строке "Redirected to" ниже.

Processing ApplicationController#execute(for 127.0.0.1 at 2009-12-19 00:28:40) [POST]
Parameters: {"command"=>{"line"=>"log dodo wg"}, "authenticity_token"=> <...token>}
Redirected to http://localhost:3000/benutzer/check_login?method=get&stylesheet=scaffold&user%5Bname%5D=dodo&user%5Bpassword%5D=wg
Completed in 9ms (DB: 0) | 302 Found [http://localhost/execute]

Я хочу, чтобы рельсы не помещали параметры в URL и вместо них передавали их скрытыми.

Когда я отправляю форму, созданную с помощью form_for, в URL ничего не появляется, поэтому я предполагаю, что это должно быть возможно.

Скажите, пожалуйста, как это сделать.


Шаги пытались

  • Я пробовал разные "html-глаголы": получить, поставить, опубликовать - без разницы. Хотя вызов check_login действительно короткий, URL-адрес с параметрами отображается в моей консоли
  • создать переменную экземпляра и передать ее как параметр (странно, тоже не сработало)
  • часы form_for работают - безрезультатно, понятия не имею


// Edith:
Спасибо за вашу помощь. Возможно, я не уточнил свою проблему достаточно подробно. У меня есть text_field, в котором я ввожу короткие команды (экспериментально). Его форма вызывает execute в AppController, которая в случае логин-данных выполняет redirect_to check_login. Мне не нужен доступ к веб-странице, я просто хочу запустить метод. Мне понравилась идея поместить его в :flash, но мне интересно, есть ли "аккуратный" способ передать скрытые данные.

Ответы [ 4 ]

4 голосов
/ 19 декабря 2009

TL; Версия DR: Используйте форму.

Вы никогда не сможете полностью скрыть параметры, можно использовать инструменты для мониторинга запросов и просмотра данных / параметров публикации. Однако вы можете запутать его зашифрованным сеансом. Также кажется, что вы отправляете информацию для входа через GET-запрос, это, как правило, плохая практика.

Тем не менее ...

Что для вас не так, так это то, что вы не генерируете никаких пост-данных с помощью link_to: method =>: post. link_to будет использовать любые пармы, которые вы ему дадите, для генерации URL. Формы Wheres будут отправлять все параметры, сгенерированные формой, в виде POST-данных на URL, сгенерированный в вызове form_for.

При получении запроса POST Rails объединит параметры, полученные при маршрутизации с URL-адреса, с полученными данными поста в один хэш параметров.

Как в POST к

http://localhost:3000/benutzer/check_login?stylesheet=scaffold&user%5Bname%5D=dodo&user%5Bpassword%5D=wg

создает тот же хэш параметров в действии принимающего контроллера, что и POST для http://localhost:3000/benutzer/check_login со следующими данными:

 stylesheet=scaffold&user[name]=dodo&user[pasword]=wg

В журнале сервера не будет различий между двумя запросами.

Если вы посмотрите, что делает form_for, он отправляет данные POST, построенные из входных данных формы, в URL, сгенерированный аргументами.

form_for @user, create_user_url(:stylesheet => "scaffold") do |f|
  f.text_field :name
  f.password_field, :password
end

Эта форма отправит данные формы по URL-адресу, созданному из опций. В этом примере URL-адрес: http://localhost:3000/users/create?stylesheet=scaffold, а данные формы:

user[name]=name_field_value_at_submit&user[password]=password_field_value_at_submit

link_to не будет заполнять данные для вас. Вы должны сделать это через форму или с помощью JavaScript. Документация link_to содержит пример того, как сделать это с помощью JavaScript. Посмотрите, как обрабатывается уничтожение с помощью onclick.

Если вам действительно не нравятся кнопки, вы можете использовать link_to_function для отправки формы.

3 голосов
/ 19 декабря 2009

Заменить

:method => :get)

с

:method => :post)

В чем разница между :get и :post? Читать Методы GET и POST в HTML-формах - в чем разница?

1 голос
/ 19 декабря 2009

С помощью form_for вы создаете форму, которая затем POST отправляется на сервер, поэтому вы не видите параметров в URL-адресе - они находятся в теле http-запроса. Но невозможно перенаправить браузер пользователя из какого-либо действия в контроллере, чтобы сделать еще один POST - если бы это было возможно, тогда я мог бы перенаправить пользователя к (например) форме изменения электронной почты gmail или другим формам. Вы можете перенаправить пользователя только на другой сайт, браузер которого затем GET s.

Если вы действительно не хотите отображать параметры в URL, и оба действия находятся в одном приложении, вы можете сохранить эти параметры в session или flash хранилище и получить их в следующем запросе после перенаправления.

0 голосов
/ 16 сентября 2013

Вы можете использовать Ajax-запрос для отправки данных формы в действие :

В некоторых случаях не очень хорошо изменить : получить на : post .

Например, в случае действия контроллера : index его использование не подходит : post

Поэтому используйте ajax call для отправки формы и обновления только динамического содержимого страницы.

В файле сценария js.coffe

$ ->
  $("#button-id").on "click", (ev) ->

  $.ajax
    type: "GET"
    dataType: "html"
    url: "/horoscope_dailies"
    data:
      date: date
    success: (data) ->
      $("#index_content").html data
    error: (object, error) ->
      console.log error

В вашем контроллере действие

render partial: 'partial_name' if request.xhr?

В вашем представлении файл:

%div{:id => 'partial_content'} 
  = render 'partial_name'
...