2017-01-25 8 views
0

私のRails 5アプリケーションで、作成した新しいアクションを使用してUserモデルを更新するフォームを作成しようとしています。Railsフォームが間違ったIDを渡す

しかし、私は404エラーに遭遇しています(しかし、現在の値がフォームに表示されているので、レコードがそこにあります)。私はそれがUser.idがフォームに正しく渡されていないためだと思うが、私は確信が持てない。

エラー: ActiveRecord::RecordNotFound (ActiveRecord::RecordNotFound)

Started PATCH "https://stackoverflow.com/users/submit_info" for ::1 at 2017-01-24 23:02:31 -0800 
Processing by UsersController#update as HTML 
Parameters: {"utf8"=>"✓", "authenticity_token"=>"[FILTERED]", "user"=>{"name"=>"Foo"}, "commit"=>"Submit Details", "id"=>"submit_info"} 
User Load (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`slug` = 'submit_info' ORDER BY `users`.`id` ASC LIMIT 1 
Completed 404 Not Found in 3ms (ActiveRecord: 0.0ms) 

<%= simple_form_for @user, url: submit_info_users_path do |f| %> 
    <%= f.input :name %> 
<%= f.button :submit %> 

コントローラ

def submit_info 
    @user = User.friendly.find(current_user.id) 
    respond_to do |format| 
    if @user.save(user_params) 
     format.html { redirect_to @user, notice: 'User was successfully updated.' } 
     format.json { render :show, status: :ok, location: @user } 
    else 
     format.html { render :info } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
    end 
end 

# I'm using the Friendly_ID gem 
def set_user 
    @user = User.friendly.find(params[:id]) 
end 

routes.rbを

devise_for :users, :controllers => { :registrations => "registrations", :omniauth_callbacks => "users/omniauth_callbacks" } 
resources :users do 
    collection do 
    get 'info' 
    post 'submit_info' 
    end 
end 
+0

'submit_info_users_path(@user)'のように、あなたはおそらくユーザを渡さなかったでしょう。 – Deep

+0

私はそれを試しても同じ結果を得ます、あるいは 'submit_info_users_path(: id => @ user.id) ' – yellowreign

+1

Aah申し訳ありませんが、' collection'ルートの 'submit_info'は、そのアクションを使ってユーザーを更新したいので' member'ルートにあるはずです。 – Deep

答えて

0

あなたは特定のユーザーを更新する必要があり、あなたはcollectionルートのアクションについて言及しています。代わりに、それはmemberルートにする必要があります:

resources :users do 
    collection do 
    get 'info' 
    end 
    member do 
    post 'submit_info' 
    end 
end 

あなたがパスを渡すときに、このmemberルートがルートにユーザーの正しいidを保証します。 collectionルートは、すべてのユーザーを一覧表示するユーザーインデックスページのようなオブジェクトの収集に使用されます。

そして、あなたはあなたがあなたのコントローラ内でメソッドを定義する必要があり、強力なパラメータのためにそうuser_params上の問題に直面していたとして:

def user_params 
    # permitted attributes 
end 

これはあなたのコントローラでprivate方法(強制ではありませんが、良いように定義する必要があります練習)。

関連する問題