Rails得到错误:表单中的第一个参数不能包含nil或为空

时间:2014-04-12 21:25:56

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

我已经收到这个错误几天了,我完全被阻止了。我尝试重做模型(我跟随导轨启动指南)并且没有到达任何地方。

  

表单中的第一个参数不能包含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

2 个答案:

答案 0 :(得分:0)

错误基本上意味着您未设置要在form_for

中使用的变量

由于您是初学者,请让我解释一下它是如何运作的:

  

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

     

与所有方法一样,form_for具有arguments/parameters,它依赖于respond_with来帮助方法正确运行。 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

您应该阅读{{3}}以了解其运作方式

答案 1 :(得分:0)

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

@time_delta = @stock.time_deltas.build

编辑:

TimeDelta模型的命名也存在问题,因为在Ruby中'delta'是复数'deltum'。要遵守Rails约定,请将模型名称更改为TimeDeltum,或者告诉Rails使用'delta'作为'delta'的复数形式。您可以了解如何操作here