nil的未定义方法`errors':NilClass

时间:2012-09-25 15:56:41

标签: ruby-on-rails ruby

以下是我编辑的详细信息:

我有我的控制器,

class Enr::Rds::SurvRdsapXrefsController < Enr::Controller

  def index
    @enr_rds_surv_rdsap_xrefs = Enr::Rds::SurvRdsapXref.paginate(page: params[:page])
  end

  def show
  end

  def new
     @enr_rds_surv_rdsap_xref = Enr::Rds::SurvRdsapXref.new
  end

  def edit
    @enr_rds_surv_rdsap_xref = Enr::Rds::SurvRdsapXref.find(params[:id])
  end

  def create
    @enr_rds_surv_rdsap_xref = Enr::Rds::SurvRdsapXref.new(params[:enr_rds_surv_rdsap_xref])

    respond_to do |format|
      if @enr_rds_surv_rdsap_xref.save
        format.html { redirect_to :enr_rds_surv_rdsap_xrefs, notice: "Survey link was successfully created." }
        format.js
        format.json { render json: @enr_rds_surv_rdsap_xref, status: :created, location: @enr_rds_surv_rdsap_xref }
      else
        format.html { render action: "new" }
        format.js
        format.json { render json: @enr_rds_surv_rdsap_xref.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
  end

  def destroy
  end
end

这是我的观点表格,如

<%= form_for(@enr_rds_surv_rdsap_xref, :remote => true) do |f| %>

<% if @enr_rds_surv_rdsap_xref.errors.any? %>
  <div id="error_explanation">
    <div class="validate">
      The form contains <%= pluralize@enr_rds_surv_rdsap_xref.errors.count, "error") %>.
    </div>
    <ul>
    <% @enr_rds_surv_rdsap_xref.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

<div class="control-group">
  <%= f.label :section %><br />
  <%= f.text_field :section %>
</div>

<%= f.submit %>

<% end %>

当我单击索引页面以创建新链接时,索引页面显示错误,如

Enr / rds / surv_rdsap_xrefs #index

中的NoMethodError

nil的未定义方法`errors':NilClass

感谢支持,请建议我纠正错误。我是ROR的新手。感谢

3 个答案:

答案 0 :(得分:2)

您的错误显示index模板的呈现导致错误,这意味着您正在为索引模板中的新调查(上面的代码段)呈现表单。这很好,但是如果您要这样做,则必须在index以及new中实例化新的调查。

最简单的方法是,您只需将new中的代码复制到index

def index
  @enr_rds_surv_rdsap_xrefs = Enr::Rds::SurvRdsapXref.paginate(page: params[:page])
  @enr_rds_surv_rdsap_xref = Enr::Rds::SurvRdsapXref.new
end

def new
   @enr_rds_surv_rdsap_xref = Enr::Rds::SurvRdsapXref.new
end

为了使您的代码稍微干一点,您可能会更改创建新实例的位置。您经常会看到的模式类似于:

before_filter :build_record, :only => [:new, :index]

protected

def build_record
  @survey = YourSurvey.new
end

这样,如果你没有任何其他逻辑,你甚至不需要编写新的/索引方法。

答案 1 :(得分:0)

您是否还在控制器的新操作中设置了@survey?该错误意味着当呈现视图时@survey为nil,因此设置该实例变量时一定存在问题。

当您转到“新”视图或尝试提交表单(创建)时,是否收到错误?

答案 2 :(得分:0)

The form contains <%= pluralize@enr_rds_surv_rdsap_xref.errors.count, "error") %>

这行代码就是问题所在。你在复数和@enr之间缺少“(”......

解释:RoR认为对象是:pluralize @ enr ...而不是@ All,而且他对这种对象没有错误。