Rails: 不允许的参数::authenticity_token, :order, :commit。升级后

Rails: Unpermitted parameters: :authenticity_token, :order, :commit. after upgrade

我正在将一个功能性应用程序从 Ruby 1.8.7 Rails 3 升级到 Ruby 3 Rails 7:一段漫长的旅程,我快完成了。但是我有一个订单流程,升级后不是运行,我很难调试。订单流程包含一个多步骤形式,通过部分呈现和我的 Order controller.

中的创建函数

在多步骤表单的第一步中,您必须输入运输详细信息。尝试进行下一步时,我在服务器日志中收到以下错误消息:Unpermitted parameters: :authenticity_token, :order, :commit. Context: ... etc 并且在我的网站中显示所有验证均失败的注释。

Started POST "/orders" for ::1 at 2022-02-22 17:24:01 +0100
Processing by OrdersController#create as HTML
  Parameters: {"authenticity_token"=>"[FILTERED]", "order"=>{"email"=>"name@example.com", "phone_number"=>"1234567", "ship_to_first_name"=>"John", "ship_to_last_name"=>"Doe", "ship_to_address"=>"Pennsylvania Avenue 12", "ship_to_city"=>"Houston", "ship_to_postal_code"=>"12345", "land_id"=>"112", "shipping_service_id"=>"50"}, "commit"=>"Continue"}
  Cart Load (0.3ms)  SELECT `carts`.* FROM `carts` WHERE `carts`.`id` = 4 LIMIT 1
  ↳ app/controllers/application_controller.rb:66:in `initialize_cart'
Unpermitted parameters: :authenticity_token, :order, :commit. Context: {controller: OrdersController, action: create, request: #<ActionDispatch::Request:0x00007fee489e8e30>, params: {"authenticity_token"=>"[FILTERED]", "order"=>{"email"=>"name@example.com", "phone_number"=>"1234567", "ship_to_first_name"=>"John", "ship_to_last_name"=>"Doe", "ship_to_address"=>"Pennsylvania Avenue 12", "ship_to_city"=>"Houston", "ship_to_postal_code"=>"12345", "land_id"=>"112", "shipping_service_id"=>"50"}, "commit"=>"Continue", "controller"=>"orders", "action"=>"create"} }
  CartItem Load (0.4ms)  SELECT `cart_items`.* FROM `cart_items` WHERE `cart_items`.`cart_id` = 4
  ↳ app/models/cart.rb:86:in `inject'
  ....

这与旧应用程序中的流程相同。

Started POST "/orders" for 127.0.0.1 at Tue Feb 22 10:02:12 +0100 2022
Processing by OrdersController#create as HTML
  Parameters: {"authenticity_token"=>"sometoken", "order"=>{"email"=>"name@example.com", "ship_to_first_name"=>"John", "ship_to_address"=>"Pennsylvania Avenue 12", "ship_to_city"=>"Houston", "land_id"=>"112", "ship_to_last_name"=>"Doe", "ship_to_postal_code"=>"12345", "phone_number"=>"1234567", "shipping_service_id"=>"1"}, "commit"=>"Continue", "utf8"=>"✓"}
  Cart Load (0.3ms)  SELECT `carts`.* FROM `carts` WHERE `carts`.`id` = ? LIMIT 1  [["id", 6255]]
  CartItem Load (0.8ms)  SELECT `cart_items`.* FROM `cart_items` WHERE `cart_items`.`cart_id` = 6255
  ActiveShippingHub Load (0.3ms)  SELECT `active_shipping_hubs`.* FROM `active_shipping_hubs` LIMIT 1
   (0.5ms)  SELECT MAX(`cart_items`.`length`) AS max_id FROM `cart_items` WHERE `cart_items`.`cart_id` = 6255
   (0.5ms)  SELECT MAX(`cart_items`.`width`) AS max_id FROM `cart_items` WHERE `cart_items`.`cart_id` = 6255
  Rendered shared/_error_messages.html.erb (0.1ms)
  Land Load (0.6ms)  SELECT `lands`.* FROM `lands` WHERE `lands`.`id` = 112 LIMIT 1
  ShippingService Load (0.5ms)  SELECT `shipping_services`.* FROM `shipping_services` WHERE `shipping_services`.`id` = 1 LIMIT 1
  ProductVariant Load (0.3ms)  SELECT `product_variants`.* FROM `product_variants` WHERE `product_variants`.`id` = 14 LIMIT 1
  Image Load (0.3ms)  SELECT `images`.* FROM `images` WHERE `images`.`id` = 174 LIMIT 1
  Rendered orders/_paymentoptions_step.html.erb (10.6ms)
  Rendered orders/new.html.erb within layouts/application (14.0ms)
  Rendered layouts/_header.html.erb (0.1ms)
  Rendered layouts/_footer.html.erb (0.5ms)
Completed 200 OK in 68ms (Views: 20.9ms | ActiveRecord: 26.9ms)

我的订单创建操作开始于

  def create
    session[:order_params].deep_merge!(order_params) if params[:order]
    @order = Order.new(session[:order_params])
    @shipping_services = @cart.available_shipping_services.joins(:lands).where(lands: {id: @order.land_id})
    @order.customer_ip = request.remote_ip 
    populate_order
    @order.current_step = session[:order_step]
    ...

我在同一个控制器中设置了 order_params 作为强参数:

...
  private

  def order_params
    params.permit(:bill_to_address, :bill_to_city, :bill_to_first_name, :bill_to_last_name, :bill_to_land, :bill_to_land_id, :bill_to_postal_code, :date_payment_reminder, :email, :EULA, :express_token, :land_id, :payment, :date_payment_reminder, :phone_number, :signupnewsletter, :ship_to_address, :ship_to_city, :ship_to_first_name, :ship_to_last_name, :ship_to_postal_code, :shipping_service, :shipping_service_id, :shipping_date, :tracking_number, :order_status, :order_status_id, :stripe_card_token, :TOS)
  end
end

我不确定为什么会出现此错误。在 Rails 的较新版本中使用 strong_parameters 或现在验证关联的方式?

当我在我的 Order model 中关闭所有验证时,我仍然在我的日志中收到相同的消息,但得到的消息是 shipping_land、shipping_service 存在问题和 bill_to_land 字段:我的 Order model.

的三个关联

关联在我的Order model中设置如下:

# Associations
  belongs_to :bill_to_land, class_name: "Land", foreign_key: :bill_to_land_id
  belongs_to :land, foreign_key: :land_id
  belongs_to :order_status
  belongs_to :shipping_service

多步形式设置在orders/new.html.erb

<%= form_for @order do |f| %>
  <%= render "#{@order.current_step}_step", :f => f %>
<%= f.submit "Continue" unless @order.payment_options_step? || @order.billing_step? || @order.creditcard_options_step? || @order.last_step? %>

在多步骤表单中,我只收集数据并在会话的步骤之间踢这些数据。订单条目仅在最终提交后创建。

为什么我会收到此错误消息?如何调试订单会话?写入了哪些数据...

我希望有人能把我引向正确的方向。

private
  def order_params
    params.require(:order).permit(:bill_to_address, :bill_to_city, :bill_to_first_name, :bill_to_last_name, :bill_to_land, 
                                  :bill_to_land_id, :bill_to_postal_code, :date_payment_reminder, :email, :EULA, :express_token, :land_id, :payment, :date_payment_reminder, :phone_number, :signupnewsletter, :ship_to_address, :ship_to_city, :ship_to_first_name, :ship_to_last_name, :ship_to_postal_code, :shipping_service, :shipping_service_id, :shipping_date, :tracking_number, :order_status, :order_status_id, :stripe_card_token, :TOS)
  end
end