2016-09-27 2 views
0

У меня есть HTML-форма, предназначенная для сброса пароля. Его метод равен PATCH, и он должен нанести удар по update методу PasswordResetController. Однако при подаче он всегда делает запрос GET, независимо от того, указан ли method. Я могу напечатать метод = ANYTHINGHERE, и он всегда делает запрос GET.Рельсы с использованием метода GET, независимо от того, что указано

Моя форма проста:

<form class="group" action="<%= password_reset_url %>" method="PATCH"> 
    <input type="hidden" name="authenticity_token" value="<%= form_authenticity_token %>"> 

    <input type="password" class="password-login" name="new_password" placeholder="New Password"> 
    <input type="password" class="password-login" name="new_password_verify" placeholder="New Password Confirmation"> 
    <button class="login-button">Reset Password</button> 

    </form> 

Мои маршруты, кажется, в порядке:

password_reset_index POST /password_reset(.:format)   password_reset#create 
new_password_reset  GET /password_reset/new(.:format)  password_reset#new 
edit_password_reset GET /password_reset/:id/edit(.:format) password_reset#edit 
password_reset   PATCH /password_reset/:id(.:format)  password_reset#update 
         PUT /password_reset/:id(.:format)  password_reset#update 

определяется как resources :password_reset, only: [:new, :create, :edit, :update]

И мой контроллер:

class PasswordResetController < ApplicationController 

    new, edit, create....etc. 

    def update 
     user = ... 
    end 

end 

Cr eate, new и edit все работают отлично, но при отправке формы он даже не попадает в метод обновления. Я просто получаю No route matches [GET] "/password_reset/longTokenString. Есть идеи? Мне кажется, что я исчерпал свои возможности здесь.

Это не дубликат this question, так как строка токена правильно сгенерирована. Строка токена также используется как идентификатор в маршруте /password_reset/:id/edit, и там тоже хорошо работает.

Заранее спасибо.

ответ

0

Согласно стратегии рельсов здесь является четкое объяснение, если в чем разница между PUT и PATCH методы.

Если вы используете предыдущую версию Rails, вам может быть интересно, почему действие обновления маршрута RESTful сопоставляется с HTTP-глаголом PATCH вместо PUT. В документе стандартов HTTP RFC 57892 указано, что запрос PUT для данного ресурса предназначен для полной замены на исходном сервере. Однако при обновлении ресурса в Rails, редко, если вообще когда-либо, вы заменяете весь ресурс при выполнении обновления. Например, при обновлении модели Active Record Rails устанавливает атрибут update_at timestamp, а не запрашивающий клиент.

Чтобы лучше следовать семантике HTTP, Rails будет использовать HTTP-глагол PATCH для обновлений. PATCH позволяет как полное, так и частичное обновление ресурса и больше подходит для того, как Rails обновляет ресурсы. Если вы обновляете существующее Rails-приложение, HTTP-глагол PUT по-прежнему будет отображать действие обновления в маршрутах RESTful 10, но рекомендуется использовать PATCH, двигаясь вперед.

Я собираюсь объяснить, как опция User Edit работает в рельсах.

приложение/контроллеры/users_controller.гь

def edit 
    @user = User.find(params[:id]) 
end 

Соответствующий пользователь редактировать вид

приложение/просмотров/пользователей/edit.html.erb

<% provide(:title, "Edit user") %> 
<h1>Update your profile</h1> 

<div class="row"> 
<div class="col-md-6 col-md-offset-3"> 
<%= form_for(@user) do |f| %> 
<%= render 'shared/error_messages' %> 

<%= f.label :name %> 
<%= f.text_field :name, class: 'form-control' %> 

<%= f.label :email %> 
<%= f.email_field :email, class: 'form-control' %> 

<%= f.label :password %> 
<%= f.password_field :password, class: 'form-control' %> 

<%= f.label :password_confirmation, "Confirmation" %> 
<%= f.password_field :password_confirmation, class: 'form-control' %> 

<%= f.submit "Save changes", class: "btn btn-primary" %> 
<% end %> 

Глядя на источник HTML

<form accept-charset="UTF-8" action="https://stackoverflow.com/users/1" class="edit_user" 
     id="edit_user_1" method="post"> 
    <input name="_method" type="hidden" value="patch" /> 
    . 
    . 
    . 
</form> 

Примечание: Примечание здесь поле для ввода скрытых:

<input name="_method" type="hidden" value="patch" /> 

Сформировать Документация:

method: (:get|:post|:patch|:put|:delete) 

«В хэш опций. Если глагол не GET или POST, которые изначально поддерживаются HTML формы, форма будет установлена ​​в POST и скрытый вход называется _method будет нести предназначенный глагол для сервера интерпретировать «

Ссылка:. http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

Надежда так что мое объяснение было бы понятно для понимания концепции. Счастливые Coding :)

+0

Спасибо за очень тщательный ответ. Иногда трудно увидеть лес через деревья. Я на самом деле знал это уже, но недавно сделал так много патчей AJAX, что он даже не пришел мне в голову. Иногда вы попадаете в рутину, а основные понятия выходят из окна. Время идти обновляться .... Спасибо Naresh! – yawnr

+0

Его мое удовольствие. Рад помочь вам @yawnr. Счастливое кодирование :) –

0

В соответствии со стандартом HTML, вы не можете добавить put как метод для формы. Единственными допустимыми значениями для атрибута метода являются get и post. <form method="put"> недействителен HTML и будет обрабатываться как <form>, то есть отправить запрос GET.

Вы также можете написать код формы, используя тег формы рельсов.

0

некоторых моментов помнить ---

  1. если вы делаете использование в form_for тега, вы не должны беспокоиться о чем-нибудь еще beca Использование рельсов само использует Record identification для обработки действий создания (POST), новых (GET) и обновления (UPDATE/PATCH).
  2. Если вы не используете form_for tag равномерно, это ваш случай, вы должны точно соответствовать URL-адресу, Так что вам нужно также передать идентификатор.

пример: -

<form class="group" action="<%= password_reset_url(@your_model.id) %>" method="PATCH"> 

НАДЕЮСЬ ЭТО ПОМОГАЕТ :)

Смежные вопросы