как я могу скрыть параметры, которые я передаю методу (например, form_for)?

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

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

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

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

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

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 работает - безрезультатно, понятия не имею


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


person Dodo    schedule 18.12.2009    source источник
comment
Это похоже на вывод отладки для меня. Запустите его в рабочем режиме и посмотрите, отображается ли он в ваших журналах.   -  person Azeem.Butt    schedule 19.12.2009
comment
@NSD: Вы правы, но меня беспокоят не логи. Если мне повезет, я также увижу URL-адрес с параметрами в своем браузере. form_for этого не делает, но как?   -  person Dodo    schedule 19.12.2009
comment
Он использует POST-запросы. Посмотрите сами источники.   -  person Azeem.Butt    schedule 19.12.2009
comment
Разве это не лучше, чем before_filter? Вот как все плагины аутентификации справляются с такими вещами.   -  person EmFi    schedule 19.12.2009
comment
@EmFi: о чем ты говоришь? Что мне делать в before_filter?   -  person Dodo    schedule 19.12.2009


Ответы (4)


TL; Версия аварийного восстановления: используйте форму.

Вы никогда не сможете полностью скрыть параметры, можно использовать инструменты для мониторинга запросов и просмотра данных/параметров публикации. Однако вы можете запутать его с помощью зашифрованного сеанса. Также кажется, что вы отправляете информацию для входа через запрос 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 для отправки формы.

person EmFi    schedule 19.12.2009

Заменять

:method => :get)

с участием

:method => :post)

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

person Pete    schedule 18.12.2009
comment
К сожалению, это не помогает. Я конечно читал про GET и POST & co, но для моего звонка это не имеет значения. Где Redirected to говорит ...check_login?method=get..., там написано method=post, когда я заменяю get. - person Dodo; 19.12.2009
comment
Вам нужно будет сделать что-то помимо вызова redirect_to, чтобы сделать запрос POST. - person Azeem.Butt; 19.12.2009
comment
Как я сейчас уточнил свой вопрос – можете ли вы сказать мне, что мне нужно сделать? - person Dodo; 19.12.2009

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

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

person MBO    schedule 19.12.2009
comment
Оно работает! (с flash) . Но нет ли другого способа вызвать check_login с параметрами? Обычно login-форма на странице вызывает check_login как :action, и тогда у нее нет параметров в URL-адресе. Так почему я не могу? - person Dodo; 19.12.2009

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

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

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

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

В файле скрипта 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'
person Taimoor Changaiz    schedule 16.09.2013