我的html页面中有这样的表格
<%= form_for '/purchases', html: {class: "form form-horizontal validate-form", novalidate: "novalidate"} do |f| %>
但是当我检查表单
时,表单操作就像这样action = '/purchases/new'
我希望操作只是/purchases
我的控制器方法就像
@purchase = OrderItems.new
答案 0 :(得分:3)
如果您正确配置了路线,则只需:
<%= form_for @purchase, html: {class: "form form-horizontal validate-form", novalidate: "novalidate"} do |f| %>
当然,前提是您在@purchase
操作中设置了new
:
@purchase = Purchase.new
答案 1 :(得分:1)
-
form_for 适用于对象 -
#app/controllers/purchases_controller.rb
Class PurchasesController < ApplicationController
def new
@purchase = Purchase.new
end
def create
@purchase = Purchase.new(purchase_params)
@purchase.save
end
private
def purchase_params
params.require(:purchase).permit(:purchase, :attributes)
end
end
使用form_for
时需要注意的重要事项是如何从您定义的ActiveRecord对象中构建表单。这非常重要,并且是您错误的根源:
<%= form_for @purchase do |f| %>
这将从ActiveRecord对象本身构建表单的所有不同属性(包括action
属性)。这意味着如果您使用对象之外的其他任何内容填充form_for
,您就会遇到麻烦(由您的错误显示)
-
form_tag 用于数据 -
<%= form_tag your_path do %>
...
<% end %>
这可能更适合您的情况,因为它可以让您创建一个独立的&#34;表单 - 使您能够将非以模型为中心的数据发送到应用程序的表单
我们对搜索设施等使用form_tag
实施
<强>解决方案强>
正如Marek
所指出的,您需要使用ActiveRecord对象填充form_for
。要执行此操作,首先需要确保在将值传递到表单之前,已在控制器的new
操作中初始化了对象:
#app/controllers/purchases_controller.rb
Class PurchasesController < ActiveRecord::Base
def new
@purchase = Purchase.new
end
...
end
#app/views/purchases/new.html.erb
<%= form_for @purchase do |f| %>
答案 2 :(得分:0)
我想详细说明这里提出的答案。 form_for
的工作方式是将表单输入名称基于传递给它的第一个参数。您可以将字符串或符号作为第一个参数传递,它应该可以工作,就像您的示例一样。
= form_for :purchase do |f|
= f.text_field :order
将生成一个表单,该表单将提交到当前网址,并包含1个名为purchase[order]
的文字字段。
马雷克的回答是正确的,但它没有回答你的问题。如果按照惯例,表单的对象与处理请求的控制器不匹配,您可以将url
选项传递给form_for
。
# controller
def new
@purchase = OrderItem.new
end
# view
= form_for @purchase, url: '/purchases' do |f|
= f.text_field :order
这会创建一个操作设置为/purchases
的表单,但文本字段的名称将为order_item[order]
。
最终注释
form_for
并非专门用于API docs