Rails表单行动

时间:2014-08-08 09:26:58

标签: ruby-on-rails ruby ruby-on-rails-4

我的html页面中有这样的表格

<%= form_for '/purchases', html: {class: "form form-horizontal validate-form", novalidate: "novalidate"} do |f| %>

但是当我检查表单

时,表单操作就像这样
action = '/purchases/new'

我希望操作只是/purchases

我的控制器方法就像

@purchase = OrderItems.new

3 个答案:

答案 0 :(得分:3)

如果您正确配置了路线,则只需:

<%= form_for @purchase, html: {class: "form form-horizontal validate-form", novalidate: "novalidate"} do |f| %>

当然,前提是您在@purchase操作中设置了new

@purchase = Purchase.new

答案 1 :(得分:1)

我认为您在form_forform_tag

之间感到困惑

-

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

中所述的活动记录对象