【问题标题】:Why does form_for(@object) do |f| work in the _form.html.erb but not in the index.html.erb为什么 form_for(@object) 做 |f|在 _form.html.erb 中工作,但不在 index.html.erb 中
【发布时间】:2015-06-28 01:49:16
【问题描述】:

好的,所以我试图将在我的 ruby​​ 项目的“index.html.erb”中的“_form.html.erb”中找到的表单因错误而崩溃

“表单中的第一个参数不能包含 nil 或为空”

<%= form_for(@customer) do |f| %>

我知道将 @customer 更改为 Customer.new 可以解决此问题,但我想知道为什么这在一个文件中没有必要,而在另一个文件中

为什么会发生这种情况以及如何制作一个表单来更新索引页面上的 sqlite db

【问题讨论】:

  • 您是否在控制器中定义了@customer?你的渲染部分是什么样的?
  • 谢谢我没有意识到我还需要添加@customer = customer.new。谢谢

标签: ruby-on-rails ruby forms


【解决方案1】:

@customer 是一个变量,必须在相应的控制器操作中的某处创建。如果您的 #index 控制器操作按该名称定义了一个变量,那么您将能够在视图模板中使用它;否则你需要像这样创建它:

@customer = Customer.new # (or whatever the value is)

当 Rails 处理一个请求时,它只是执行从一堆不同文件创建的一大块(且复杂的)代码。首先它执行适当的控制器操作,然后执行在相应视图模板中找到的任何 Ruby 代码。因此,在视图模板中使用的任何变量(或任何方法名称)都是在此之前的某个时间点首先定义的:要么在控制器操作中,要么在 Rails 无数的内置帮助文件之一中。

【讨论】:

  • 谢谢。这很有帮助
【解决方案2】:

当我在索引或显示页面中使用 form_for 时,我喜欢将其设置为新的

<%= form_for Customer.new, url: {controller: "customers", action: "create"} do |f| %>
  ...
  <%= f.submit %>
<% end %>

那样有一个对象要创建,我也喜欢传入控制器和动作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 2023-01-18
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    相关资源
    最近更新 更多