【问题标题】:Unable to submit form on rails contoller无法在 Rails 控制器上提交表单
【发布时间】:2020-04-02 00:12:48
【问题描述】:

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

表格:

= 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 方法中命中。

【问题讨论】:

  • 你说它不是“击中” create 方法,但我看到了这个:Processing by CartsController#create as HTML。事务日志的其余部分是什么样的?也许有一个rollback,因为Cart 应该是belong_to 一个User 或类似的东西?
  • @jvillian 我的购物车模型是空的。
  • 我不知道“我的购物车模型是空的”是什么意思。你能从你的服务器显示你的整个交易日志吗?仅显示您提供的两行是不够的。
  • 请看一下。
  • @KickButtowski 我试过了,但没有按预期工作。那我发帖吧。

标签: ruby-on-rails ruby ruby-on-rails-5


【解决方案1】:

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

你有这个日志:

“1:04:40 AM web.1 | Started POST "/carts" for ::1 at 2019-12-09 01:04:40 +0500" 这表明您正在点击控制器。

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,您将如何处理这种情况?如果一切都保存了,您可能不想重定向到根路径。换句话说,考虑你想要什么,也许让代码更适合你的目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多