2016-05-08 4 views
-1

私はレールが新しく、ユーザーの情報を更新するためにブートストラップのシンプルなフォームを使用していますが、間違ったコントローラを呼び出し続けます。レールが間違ったメソッドを呼び出す

フォームのコード:

simple_form_for(@user) do |f| 
= f.input :forename 
= f.input :surname 
.form-actions 
    = f.button :submit, :method => :update 

コードコントローラに:ルートで

def update 
    if @user.update(user_params) 
    redirect_to home_path 
    else 
    redirect_to wrong_path 
end 

コード:

resources :user do 
    member do 
    post :update 
    end 
end 

私は再びフォームを使用する別のページに異なるコントローラーAdminControllerupdateフォームは、AdminControllerの代わりにUserControllerを入力してください。

私はそれが正しいコントローラ/

答えて

2

を呼び出すために取得する必要がありますどのようなエラーがフォームではなく、レールの作品にどのようにRESTfulなルーティングの理解の欠如ではありません。

レール規則では、PATCH要求を送信してレコードを更新します。

実際に
PATCH /users/:id => user#update 

あなたがルートを宣言:

resources :users 

Railsはあなたのためにそのルートを作成します。名前は複数でなければならないことに注意してください!同じことがコントローラUsersControllerではなく、UserControllerに適用されます。フォームを作成し、そのようなリソースを渡すと

# sugar on top of form_for 
simple_form_for(@user) do |f| 

Railsは、レコードを見て、規則に基づいて対応するルートを見つけようとします。 Railsはモデルが永続化されているかどうかを調べるので、メソッドを指定する必要はありません。

何らかの理由でforを行う場合、送信ボタンではなく<form>要素でHTTPメソッドを指定する必要があります。

simple_form_for(@user, method: :patch) do |f| 

さらに更新ルートに対処する従来の方法は次のとおりです。

def update 
    if @user.update(user_params) 
    redirect_to home_path 
    else 
    render :edit 
    end 
end 

あなたが失敗したフォーム送信後にリダイレクトするようにしたくない - ユーザーがフォームに入力されたすべてのデータが失われます。むしろ、フォームを再レンダリングする必要があります。

+0

これはばかげているかもしれませんが、私は何をしているのか分かりません。ルートに 'PATCH'行を追加する必要がありますか? –

+0

no - 'resources:users'だけ読み込む経路を変更する – max

関連する問題