首页 > 解决方案 > 为什么我的表格没有保存?form_for 问题

问题描述

我有这个表格。我是 Rails 新手,我正在尝试编写一个简单的电子商务网站。这是唯一不起作用的部分。(它在 2 天前工作,我烧焦了)

<%= form_tag line_items_path do%>
<%binding.pry%>
<%= hidden_field_tag :lite_item, :order_id, @order.id%>
<%= hidden_field_tag :line_item, :menu_item_id, @menu_item.id%>
<%= number_field_tag :line_item, :quantity, 1 %>
<%= submit_tag "Add to Cart"%>
<% end %>

它给出的参数看起来像:

#<ActionController::Parameters {"authenticity_token"=>"VECKnS5SBot1rCyekepPXZa7TyTYkfFi0KdNRTB617ZnelmQo8Lkz_cJmQ8nAmCHUdDlPu1mpkhrPvMKysfjew", "order_id"=>"1", "menu_item_id"=>"1", "quantity"=>"1", "commit"=>"Add to Cart", "controller"=>"line_items", "action"=>"create"} permitted: false>

视图的控制器如下所示:

class MenusController < ApplicationController
   def index
@menu_items = MenuItem.all
end
def show
  @menu_item = MenuItem.find(params[:id])
  @line_items = current_order.line_items.build
end

结尾

表单实际上是通过 line_items 控制器

 def create
    binding.pry
    @line_item = LineItem.create(line_item_params)
    if @line_item.save
        @order.line_item_id = @line_item.id
        @order.save
        redirect_to cart_path(@current_cart), notice: "Item added to cart."
    else
        redirect_to menu_path(@menu_item), alert: "Item did not add to cart."
    end    
   end

像这样强大的参数

 def line_item_params
    params.require(:line_item).permit(:menu_item_id, :quantity, :order_id)
end

它应该使用 line_items_path POST>

如果需要其他任何东西,请询问。提前致谢。

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

解决方案


这里有很多问题。

签名是hidden_field_tag(name, value = nil, options = {})。因此,您实际上将使用该表单创建的参数是:

{
  "lite_item" => "order_id", # check your spelling...
  "line_item" => "quantity"
}

哎呀。而且这甚至不会发生,<%= number_field_tag :line_item, :quantity, 1 %>因为您正在传递一个整数,该方法需要一个哈希值。

如果你真的必须手动创建输入,你会想要:

<%= hidden_field_tag "line_item[order_id]", @order.id %>

但是由于您实际上有一个模型,因此没有理由应该使用form_tag代替form_for(@line_item)or form_with(model: @line_item)

<%= form_for(@line_item) do |form| %>
  <%= form.hidden_field :order_id %>
  <%= form.hidden_field :menu_item_id %>
  <%= form.number_field :quantity %>
  <%= form.submit_tag "Add to Cart"%>
<% end %>

控制器还应该对实例变量使用正确的复数形式:

def show
  @menu_item = MenuItem.find(params[:id])
  @line_item = current_order.line_items.build
end

您的创建方法也很可疑。您只需要:

def create
  # use .new not .create
  @line_item = LineItem.new(line_item_params)
  if @line_item.save
    redirect_to cart_path(@current_cart), notice: "Item added to cart."
  else
    redirect_to menu_path(@menu_item), alert: "Item did not add to cart."
  end    
end

我不知道你为什么认为你需要在@order这里更新。你的控制器应该只是在本质上是一个连接表中添加一行。


推荐阅读