【问题标题】:Rails getting the error: First argument in form cannot contain nil or be emptyRails 收到错误:表单中的第一个参数不能包含 nil 或为空
【发布时间】:2014-04-12 21:25:55
【问题描述】:

我已经收到这个错误几天了,我完全被阻止了。我尝试重做模型(我正在遵循 rails 起始指南),但没有得到任何结果。

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

我将 time_delta 作为股票的嵌套类,我试图创建一个表单来查看和创建股票节目的新 time_deltas,但我不断收到上述错误。

这是我的 time_delta 控制器:

 class TimeDeltasController < ApplicationController
    def new
    @stock = Stock.find(params[:stock_id])
    @time_delta = @stock.time_deltas.build
    respond_with(@time_delta)
  end
  def create
    @stock = Stock.find(params[:stock_id])
    @time_delta = @stock.time_deltas.build(params[:stock])
    @time_delta.save
  end

end

这是我对特定股票的看法

<h1> Stock </h1>
<table> 
    <tr>
        <th>Stock</th>
        <th>Hashtag</th>        
    </tr>
        <tr>
            <td><%= @stock.name %></td>
            <td><%= @stock.hashtag %></td>
        </tr>
</table>

<h2>Deltas: </h2>
  <table> 
    <tr>
      <th>Stock</th>
      <th>Hashtag</th>    
    </tr>
  <% @stock.deltas.each do |delta| %>
    <tr>
      <td><%= @delta.start %></td>
      <td><%= @delta.length %></td>
    </tr>
  <% end %>
</table>

<h2>Add a TimeDelta:</h2>
<%= form_for([@stock,@time_delta]) do |f| %>
  <p>
    <%= f.label :start %><br>
    <%= f.text_field :start %>
  </p>
  <p>
    <%= f.label :length %><br>
    <%= f.text_area :length %>
  </p>
  <p>
    <%= f.submit %>
  </p>
<% end %>

<%= link_to 'Back', stocks_path%>
<%= link_to 'Edit', edit_stock_path(@stock)%>

这是我在 routes.rb 中添加路线的方式:

  resources :stocks do
    resources :time_deltas
  end

任何信息将不胜感激,我真的被困住了。

编辑:库存控制器的东西

def show
        @time_delta = @stock.time_deltas.build

        @stock = find_stock
    end
private
def find_stock

  return Stock.find(params[:id])


end

【问题讨论】:

  • 您还需要在new 操作中定义@stock@time_delta
  • @Vee 已修复,但仍然出现相同的错误
  • Stock.find(params[:stock_id]) 中的new 操作是否成功?您的路线设置如何?
  • 假设视图代码用于显示您的 Stock 控制器的操作,您应该在那里创建 @time_delta。
  • @vee 当你说路线时,你指的是哪条具体路线? Donatats Stundys - 这是我的 time_delta 控制器的代码

标签: ruby-on-rails ruby model nested null


【解决方案1】:

您正在尝试访问股票/节目视图中的 @time_delta 变量,但未设置。将以下行添加到 StocksController#show action。

@time_delta = @stock.time_deltas.build

编辑:

TimeDelta 模型的命名也存在问题,因为在 Ruby 中,“delta”是“deltum”的复数。要遵守 Rails 约定,请将模型名称更改为 TimeDeltum,或者告诉 Rails 使用 'deltas' 作为 'delta' 的复数形式。你可以学习如何做到这一点here

【讨论】:

  • 所以复数固定了时间增量,但是添加编辑之前提到的行给了我这个错误'找不到表'time_deltas''有什么想法吗?
【解决方案2】:

这个错误基本上意味着你没有设置在form_for中使用的变量

作为初学者,让我解释一下它是如何工作的:

form_for 基本上是一个实例方法(帮助程序),它接受 ActiveRecord 对象,并将它们输出到 HTML 表单中。您对元素的定义 (f.____field) 用于确定要输出哪个 HTML 的方法

像所有方法一样,form_for 具有 arguments/parameters,它依赖于帮助方法正确运行。 form_for 的参数包括一个格式正确的 ActiveRecord 对象,这就是为什么每次要使用它时都必须调用 Model.new

您的错误意味着该方法无法处理您发送的变量(对象),原因可能是缺少数据 (empty) 或不存在 (nil)。要解决此问题,正如@vee 所提到的,您需要确保您的form_for 接收到正确的数据


我会试试这个:

class TimeDeltasController < ApplicationController
  def new
    @stock = Stock.find(params[:stock_id])
    @time_delta = @stock.time_deltas.build
    respond_with(@stock, @time_delta)
  end
  def create
    @stock = Stock.find(params[:stock_id])
    @time_delta = @stock.time_deltas.build(params[:stock])
    @time_delta.save
  end

end

您应该阅读 respond_with 以了解其工作原理

【讨论】:

  • 我现在仍然收到此路径错误 'undefined method `stock_time_delta_index_path' for #:0x007fc2178cb500>' 在行 ' '
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多