1

次のフォームとコントローラーがあります。

<%= form_tag do %>
    <div>
        <%= label_tag :Old %>
        <%= password_field_tag :old_password %>
    </div>

    <div>
        <%= label_tag :New %>
        <%= password_field_tag :new_password %>
    </div>

    <div>
        <%= label_tag :Confirm %>
        <%= password_field_tag :confirm_password %>
    </div>

    <div>
        <%= submit_tag "Update" %>
    </div>
<% end %>

そしてコントローラー:

def change
    @user = current_user
    @op = params[:old_password]
    @np = params[:new_password]
    @cp = params[:confirm_password]

    if @np == @cp
        @user.update_with_password(:password => @np, :current_password=>@op)

        if @user.save
            flash[:notice] = "Password Successfully Changed"
            redirect_to home_path
        end 
    else
        @user.errors.add("Incorrect confirmation")
    end
end

これはすべて、config/routes.rb の「password/change」に関連付けられています。

問題は、/password/change に移動すると、すぐにホームにリダイレクトされ、「パスワードが正常に変更されました」というフラッシュ通知を受け取ることです。私が理解しているのは、パラメーターを渡すために送信ボタンをクリックする必要がないということです。コントローラーを介して続行する前に、フォームの送信を待機するようにするにはどうすればよいですか?

4

3 に答える 3

1

ベスト プラクティスは、これら 2 つのことを別のコントローラー メソッドに分離することです。1 つは単にビューを表示するために使用し、もう 1 つは POST 要求を処理するために使用する必要があります。ただし、この方法でやりたいと思っている場合は、次のような解決策がうまくいくと思います。

def change
    @user = current_user
    @op = params[:old_password]
    @np = params[:new_password]
    @cp = params[:confirm_password]

    if @np && @np == @cp # This checks to see if params[:new_password] is nil
        @user.update_with_password(:password => @np, :current_password=>@op)

ただし、それを分離することを強くお勧めします。

于 2012-06-17T04:45:32.287 に答える
1

問題は、2 つの別々の方法が必要なことです。1 つはビューを表示し、もう 1 つはフォーム ポストを処理します。

現在、password_controller の「change」メソッドがフォームの投稿を処理しているため、フォームを表示するには「index」などのメソッドが必要です

def index
    #move your form to /views/password/index.html.erb or specifically render your 'change' view
end

次に、マークアップでアクションをフォームに追加します

<%= form_tag('/password/change') do %>
…

次に、コントローラーで変更メソッドに対してのみ POST を指定できます

class PasswordController < ApplicationController
    verify :method => :post, :only => :change
…

アップデート

verify メソッド (Rails 3 で削除) を使用する代わりに、ルートを安静に設定するか ( Rails Routing from the Outside In )、次のようにパスワードを変更するための特定のルートを作成する必要があります。

match 'password/change' => 'password#change', :via => :post
于 2012-06-17T04:49:49.343 に答える
0

ブラウザからパスワード/変更をレンダリングすると、params は nilになるため、@np == @cp常に TRUE と評価され、更新が実行され、保存され、リダイレクトが実行されます。

更新を試みる前に、パラメータが空でないことを確認する必要があります。

それはあなたを正しい方向に導くのに役立ちますか?

補足: コードの読みやすさの観点から、インスタンス変数の代わりに変数をインラインで使用することをお勧めしますが、それは私の意見です :)

于 2012-06-17T04:45:12.357 に答える