0

このフォームを送信するとNoMethodErrorが発生しますが、どのように機能させるかわかりません。これは、Devise gemを介した単なるパスワードリセットフォームであり@user.send_reset_password_instructions、コンソールでの試行は問題なく機能します。

これが私の見解のフォームです:

<%= form_tag reset_password_path(:email), :id => 'forgotten_password' do %>
  <%= email_field_tag :email, nil, :placeholder => 'Email address' %>
  <%= submit_tag "Reset password" %>
<% end %>

私のルートでは:

get "/dashboard/reset_password/:email" => "docs#reset_password", :as => :reset_password

私のコントローラーでは:

def reset_password
  @user = User.where(:email => params[:email]).first
  @user.send_reset_password_instructions
end

エラーは次のとおりです。

No route matches [POST] "/dashboard/reset_password/email"
4

3 に答える 3

2

ルートには、GETではなくPOSTメソッドが含まれている必要があります。そしてそれはすべきではあり/emailません/:email

post "/dashboard/reset_password/email" => "docs#reset_password", :as => :reset_password
于 2013-03-11T23:14:06.203 に答える
1

リクエストに応答するルートを定義しGET、フォームがPOSTリクエストを送信しています。ルートの方法をからgetに変更してみてくださいpost

于 2013-03-11T23:12:56.950 に答える
0

したがって、パート1は、ルートをGETではなくPOSTにすることです(前述のとおり)。通常、サーバーにデータを送信し、それによって変更が発生する場合(ユーザーアカウントにパスワードのリセットトークンを設定してメールを送信するなど)は、POSTを使用します。

ルートを次のように変更します。

POST "/dashboard/reset_password" => "docs#reset_password", :as => :reset_password

注:パスの:email部分も削除しました。あなたは本当にそれを必要としません。

パート2では、フォームを少し調整する必要があります。:email記号をパスに渡す必要はありません。この場合、それがあなたに何をもたらすかは実際にはわかりません。フォームにメールフィールドがあるため、コントローラーのparamsハッシュ(params [:email])にメールが届きます。

フォームを次のように変更します。

<%= form_tag reset_password_path, :id => 'forgotten_password' do %>
  <%= email_field_tag :email, nil, :placeholder => 'Email address' %>
  <%= submit_tag "Reset password" %>
<% end %>

これにより、フォームHTMLにPOSTフォームパス'/ dashboard/reset_password'が生成されます。ユーザーがページの[パスワードのリセット]ボタンをクリックすると、フォームの:emailフィールドが送信されます。Railsはそれをparamsに詰め込み、コントローラーメソッド'reset_password'はそれをうまく読み取ることができます。

また、コントローラーメソッドでエラーキャッチを実行することもできます。電子メールのパスワードのリセットに関する最も一般的な問題は、電子メールにタイプミスがあり、ユーザーを見つけることができないことです。その場合は、ユーザーにメッセージを返すと便利です。

幸運を!

于 2013-03-12T03:48:22.553 に答える