ruby-on-rails - 为什么我的表格没有保存?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>
如果需要其他任何东西,请询问。提前致谢。
解决方案
这里有很多问题。
签名是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
这里更新。你的控制器应该只是在本质上是一个连接表中添加一行。
推荐阅读
- reactjs - React Router 在 Azure Linux Web App 上抛出 404
- java - 如何在 micronaut 中使用生成的客户端发布
- powershell - 如何使用命令完全清除凭据管理器中的“其他”凭据
- spring-boot - 无法定位平台:“Java SE 11”使用工具链:“JDK 8 (1.8)”
- sql - 错误:列实际上不存在?为什么?
- flutter - 如何在 Flutter 中使用 json_serializable 反序列化具有 id 的 Firestore 文档?
- python - 使用python修改路径名的问题
- python - 在 Python 中将非零列名转换为行
- callback - 回调:DAQmxRegisterDoneEvent() 和 DAQmxEveryNSamplesEvent 之间的区别
- powershell - 如何使用 powershell 脚本获取最后 15 分钟的格式化日志