参数缺失或值为空 - 验证在请求中发送
Param is missing or the value is empty - validations are sent in request
我有一个名为 Wish 的模型:
class Wish < ApplicationRecord
belongs_to :user
has_one :global_product
validates :global_product_id, presence: true
validates :user_id, presence: true
end
希望路线如下:
user_wishes GET /users/:user_id/wishes(.:format) wishes#index
POST /users/:user_id/wishes(.:format) wishes#create
new_user_wish GET /users/:user_id/wishes/new(.:format) wishes#new
edit_user_wish GET /users/:user_id/wishes/:id/edit(.:format) wishes#edit
user_wish GET /users/:user_id/wishes/:id(.:format) wishes#show
PATCH /users/:user_id/wishes/:id(.:format) wishes#update
PUT /users/:user_id/wishes/:id(.:format) wishes#update
DELETE /users/:user_id/wishes/:id(.:format) wishes#destroy
用户创建 global_product 后,他们将被定向到其显示页面。从那里我创建了一个按钮来创建一个愿望。 Global_product_id 是 Wish table 上的一个外键,所以他们正在从 global_product.
中创建一个 wish
根据路由我认为需要的参数是user_id和global_product_id:
<%= link_to 'Add this product to my wish list', user_wishes_path(:global_product_id => @global_product.id,
:user_id => current_user.id),
:method=> :post,
class: "btn btn-default" %>
在wish控制器中,这里是create方法和wish_params:
def create
@wish = Wish.new(wish_params)
@wish.save
if @wish.save
redirect_to 'index'
else
render 'new'
end
end
def wish_params
params.require(:wish).permit(:global_product_id, :user_id)
end
这是我上次请求中的确切错误:
Parameters: {"authenticity_token"=>"y1vzGG5+CoyGS4XAFJ6sQPlD5XyNRfSMA14r4lWsUh3N1FA8Uz/Q7HNUMWOpsPQyBILgpjVxJCM552757yNsjw==", "global_product_id"=>"25", "user_id"=>"1"}
Completed 400 Bad Request in 1ms (ActiveRecord: 0.0ms)
我不确定这个请求有什么问题,因为在 rails 控制台中我可以使用 Wish.create(user_id: 1, global_product_id: 25).我曾尝试将 wish 和 global_product 传递到我的 link_to 请求中,但出现同样的错误,看起来我不需要这些。所需要的只是 user_id 和 global_product_id,它们在失败的请求中。
您发送的参数为:
{"global_product_id"=>"25", "user_id"=>"1"}
而您的代码:
params.require(:wish).permit(:user_id, :global_product_id)
预计是:
{"wish" => {"global_product_id"=>"25", "user_id"=>"1"}}
因此您需要修复 wish_params
方法或 link_to
调用以匹配。
您可以将 link_to
修改为:
<%= link_to 'Add this product to my wish list',
user_wishes_path(user_id: current_user.id,
wish: {
global_product_id: @global_product.id,
user_id: current_user.id
}),
method: :post,
class: "btn btn-default" %>
我有一个名为 Wish 的模型:
class Wish < ApplicationRecord
belongs_to :user
has_one :global_product
validates :global_product_id, presence: true
validates :user_id, presence: true
end
希望路线如下:
user_wishes GET /users/:user_id/wishes(.:format) wishes#index
POST /users/:user_id/wishes(.:format) wishes#create
new_user_wish GET /users/:user_id/wishes/new(.:format) wishes#new
edit_user_wish GET /users/:user_id/wishes/:id/edit(.:format) wishes#edit
user_wish GET /users/:user_id/wishes/:id(.:format) wishes#show
PATCH /users/:user_id/wishes/:id(.:format) wishes#update
PUT /users/:user_id/wishes/:id(.:format) wishes#update
DELETE /users/:user_id/wishes/:id(.:format) wishes#destroy
用户创建 global_product 后,他们将被定向到其显示页面。从那里我创建了一个按钮来创建一个愿望。 Global_product_id 是 Wish table 上的一个外键,所以他们正在从 global_product.
中创建一个 wish根据路由我认为需要的参数是user_id和global_product_id:
<%= link_to 'Add this product to my wish list', user_wishes_path(:global_product_id => @global_product.id,
:user_id => current_user.id),
:method=> :post,
class: "btn btn-default" %>
在wish控制器中,这里是create方法和wish_params:
def create
@wish = Wish.new(wish_params)
@wish.save
if @wish.save
redirect_to 'index'
else
render 'new'
end
end
def wish_params
params.require(:wish).permit(:global_product_id, :user_id)
end
这是我上次请求中的确切错误:
Parameters: {"authenticity_token"=>"y1vzGG5+CoyGS4XAFJ6sQPlD5XyNRfSMA14r4lWsUh3N1FA8Uz/Q7HNUMWOpsPQyBILgpjVxJCM552757yNsjw==", "global_product_id"=>"25", "user_id"=>"1"}
Completed 400 Bad Request in 1ms (ActiveRecord: 0.0ms)
我不确定这个请求有什么问题,因为在 rails 控制台中我可以使用 Wish.create(user_id: 1, global_product_id: 25).我曾尝试将 wish 和 global_product 传递到我的 link_to 请求中,但出现同样的错误,看起来我不需要这些。所需要的只是 user_id 和 global_product_id,它们在失败的请求中。
您发送的参数为:
{"global_product_id"=>"25", "user_id"=>"1"}
而您的代码:
params.require(:wish).permit(:user_id, :global_product_id)
预计是:
{"wish" => {"global_product_id"=>"25", "user_id"=>"1"}}
因此您需要修复 wish_params
方法或 link_to
调用以匹配。
您可以将 link_to
修改为:
<%= link_to 'Add this product to my wish list',
user_wishes_path(user_id: current_user.id,
wish: {
global_product_id: @global_product.id,
user_id: current_user.id
}),
method: :post,
class: "btn btn-default" %>