无法在Rails contoller上提交表单

问题描述 投票:1回答:1

我有控制器和表单,但是当我尝试提交表单时,它没有将值提交给控制器。

表格:

= form_for @cart do |f|
  .overflow
    - unless @product.equipment_payments.blank?
      | Equipment Payment Option
      br
      = f.select :equipment_payments, options_for_select(@product.equipment_payments), {:prompt => 'Price'}
    br
    br
    - if @product.product_plan_durations.count > 0
      - plan_durations = PlanDuration.where(id: @product.product_plan_durations.pluck(:plan_duration_id))
      | Product Plan Duration
      br
      = f.select :product_plan_duration_id, options_from_collection_for_select(plan_durations, :id, :name), {:prompt => 'Plan Duration'}
    br
    br
    .modal-footer.form-group
      = f.submit "Add to Cart"

CartsController

class CartsController < ApplicationController

  before_action :load_product

  def new
    @cart = Cart.new
  end

  def create
    @cart = Cart.new(cart_params)
    @cart.save
  end

  private

  def cart_params
    params.require(:cart).permit(:equipment_payments, :product_plan_duration_id)
  end

  def load_product
    @product = Product.find(params[:product_id])
  end

end
1:04:40 AM web.1 |  Started POST "/carts" for ::1 at 2019-12-09 01:04:40 +0500
1:04:40 AM web.1 |  Processing by CartsController#create as HTML
1:04:40 AM web.1 |    Parameters: {"utf8"=>"✓", "authenticity_token"=>"c9TcwAMtRp6MyYbgxeAcrjcklHeIFxwFmX7vhgEB5Cig8iikCE9ycSmEgfmwLEIL6myLWpQiqV5MS9WN6iMkrw==", "cart"=>{"equipment_payments"=>"Lease", "product_plan_duration_id"=>"4"}, "commit"=>"Add to Cart"}
1:04:40 AM web.1 |    User Load (0.8ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 36], ["LIMIT", 1]]
1:04:40 AM web.1 |  Redirected to http://localhost:3000/product_search?utf8=%E2%9C%93&product_search_form%5Bc%5D=3&product_search_form%5Bsc%5D=105&product_search_form%5Bq%5D=&commit=Search
1:04:40 AM web.1 |  Completed 302 Found in 7ms (ActiveRecord: 0.8ms)
1:04:40 AM web.1 |  Started GET "/product_search?utf8=%E2%9C%93&product_search_form%5Bc%5D=3&product_search_form%5Bsc%5D=105&product_search_form%5Bq%5D=&commit=Search" for ::1 at 2019-12-09 01:04:40 +0500
1:04:40 AM web.1 |  Processing by ProductSearchController#index as HTML
1:04:40 AM web.1 |    Parameters: {"utf8"=>"✓", "product_search_form"=>{"c"=>"3", "sc"=>"105", "q"=>""}, "commit"=>"Search"}

routes.rb

resources :carts

我从中加载表单的链接:

 = link_to 'Add to Cart', new_cart_path(product_id: product.id), remote: true

问题是它只是提交数据,但未在Carts控制器的create方法中命中。

ruby-on-rails ruby ruby-on-rails-5
1个回答
1
投票

1。控制器的创建动作被击中:

您有此日志:

“” web.1 AM:1:04:40 |在2019-12-09 01:04:40 +0500为:: 1开始POST“ / carts”,表明您正在击打控制器。

2。您有一个先行动作:load_product-但没有传递产品ID!(我看不到它与日志中显示的params哈希一起传递)

您将不得不在表单中添加一个隐藏字段,其中包含产品ID,或者您可以在完全过滤之前跳过该字段。

before_action :load_product, only: [:create]

3。然后应用重定向

def create
    @cart = Cart.new(cart_params)
    @cart.save
    redirect_to root_path  ## add the line
end

希望这样应该可以。

注意:这既快速又肮脏以上是使它正常工作的快速而肮脏的解决方案。也许您会想要一个更好的解决方案:即,如果购物车无法保存,那么您将如何处理呢?或者,也许您确实想在保存购物车时加载产品?如果有人通过隐藏字段手动添加其他产品ID,您将如何处理这种情况?如果一切都保存,您可能不想重定向到根路径。换句话说,请考虑您想要的内容,并可能使代码更好地适合您的目的。

© www.soinside.com 2019 - 2024. All rights reserved.