Rails嵌套资源在params哈希中返回错误的ID



我正在尝试制作一个简单的应用程序,用于提交用户的目标,然后用户可以将目标标记为已完成。我可以完成";新的";动作很好,但当我试图";编辑;params包括用户的ID而不是目标的ID。

对于我的表单partial,我使用一个简单的表单_with:

> <%= form_with(model: [@user, @goal]) do |f| %>
>     <%= f.label :goal_title, "Title" %>
>     <%= f.text_field :goal_title %>
>     <%= f.label :description, "Description" %>
>     <%= f.text_area :description %>
>     <%= f.select(:public, [['Public', true], ['Private', false]]) %>
>     <%= f.select(:completed, [['Completed', true], ['Not Completed', false]]) %>
>     <%= f.submit "Submit" %> 
>     <% end %>

我的控制器如下:

class GoalsController < ApplicationController
def index
@goals = current_user.goals
render :index
end
def new
@goal = Goal.new(user_id: current_user.id)
@user = current_user
render :new
end
def create
@goal = current_user.goals.new(goal_params)
if @goal.save
redirect_to user_goals_path
flash[:notice] = "Goal saved"
else
flash.now[:errors] = @goal.errors.full_messages
render :new
end
end
def update
@goal = Goal.find_by(id: params[:id])
if @goal.update_attributes(goal_params)
redirect_to user_goals_path
flash[:notice] = "Goal updated"
else
flash.now[:errors] = @goal.errors.full_messages
render :edit
end
end
def edit
@goal = Goal.find_by(id: params[:id])
@user = current_user
render :edit
end
def homepage
@goals = Goal.all
render :index
end
private
def goal_params
params.require(:goal).permit(:goal_title, :description, :completed, :public)
end 
end

我目前的路线是:

Prefix Verb   URI Pattern                                                                              Controller#Action
new_user_session GET    /users/sign_in(.:format)                                                                 devise/sessions#new
user_session POST   /users/sign_in(.:format)                                                                 devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format)                                                                devise/sessions#destroy
new_user_password GET    /users/password/new(.:format)                                                            devise/passwords#new
edit_user_password GET    /users/password/edit(.:format)                                                           devise/passwords#edit
user_password PATCH  /users/password(.:format)                                                                devise/passwords#update
PUT    /users/password(.:format)                                                                devise/passwords#update
POST   /users/password(.:format)                                                                devise/passwords#create
cancel_user_registration GET    /users/cancel(.:format)                                                                  devise/registrations#cancel
new_user_registration GET    /users/sign_up(.:format)                                                                 devise/registrations#new
edit_user_registration GET    /users/edit(.:format)                                                                    devise/registrations#edit
user_registration PATCH  /users(.:format)                                                                         devise/registrations#update
PUT    /users(.:format)                                                                         devise/registrations#update
DELETE /users(.:format)                                                                         devise/registrations#destroy
POST   /users(.:format)                                                                         devise/registrations#create
user_goals GET    /user/goals(.:format)                                                                    goals#index
POST   /user/goals(.:format)                                                                    goals#create
new_user_goal GET    /user/goals/new(.:format)                                                                goals#new
edit_user_goal GET    /user/goals/:id/edit(.:format)                                                           goals#edit
user_goal PATCH  /user/goals/:id(.:format)                                                                goals#update
PUT    /user/goals/:id(.:format)                                                                goals#update
DELETE /user/goals/:id(.:format)                                                                goals#destroy
new_user GET    /user/new(.:format)                                                                      users#new
edit_user GET    /user/edit(.:format)                                                                     users#edit
user GET    /user(.:format)                                                                          users#show
PATCH  /user(.:format)                                                                          users#update
PUT    /user(.:format)                                                                          users#update
DELETE /user(.:format)                                                                          users#destroy
POST   /user(.:format)                                                                          users#create
goals GET    /goals(.:format)                                                                         goals#homepage
root GET    /                                                                                        goals#homepage

params散列在";编辑";显示良好:CCD_ 1;"更新";显示CCD_ 2。ID应该是197(目标ID(,而不是379(用户ID(。

有什么建议吗?谢谢

如果您再次查看您的路线:

user_goals GET    /user/goals(.:format)                                                                    goals#index
POST   /user/goals(.:format)                                                                    goals#create
new_user_goal GET    /user/goals/new(.:format)                                                                goals#new
edit_user_goal GET    /user/goals/:id/edit(.:format)                                                           goals#edit
user_goal PATCH  /user/goals/:id(.:format)                                                                goals#update
PUT    /user/goals/:id(.:format)                                                                goals#update
DELETE /user/goals/:id(.:format) 

Goal并没有嵌套在用户资源中,而是这里的用户充当命名空间,因此当您调用form_with(model: [@user, @goal])时,Rails将选择user.id作为id参数。

解决方案:

  1. 如果您希望它是一个嵌套资源,您需要将config/routes.rb中的路由配置更改为类似的内容。

    resources :users do
    resources :goals
    end
    
  2. 如果您不需要嵌套资源,只需将form_with(model: [@user, @goal])更改为form_with(model: @goal)

最新更新