Rails NoMethodError嵌套形式的未定义方法

时间:2015-05-31 01:52:03

标签: ruby-on-rails ruby

我是rails的新手,在嵌套表单中创建新模型时遇到问题。

未定义的方法`days'为nil:NilClass

<%= form_for([@schedule, @schedule.days.build]) do |d| %>
    <%= d.label :date %><br/>
    <%= d.text_field :date %><br/>
    <%= d.submit %><br/>
<% end %>

我的日程控制器看起来像这样:

class DaysController < ApplicationController
  def create
      @schedule = Schedule.find(params[:schedule_id])
      @day = @schedule.days.create(params[:day].permit(:date))
  end
end

我的模型如下:

class Day < ActiveRecord::Base
  belongs_to :schedule
end

class Schedule < ActiveRecord::Base
  belongs_to :event
  belongs_to :user
  has_many :days, dependent: :destroy
  accepts_nested_attributes_for :days, allow_destroy: true
end

class Event < ActiveRecord::Base
  belongs_to :user
  has_many :links, dependent: :destroy
  has_one :schedule, dependent: :destroy
  has_many :days, through: :schedule

  accepts_nested_attributes_for :links, reject_if: :all_blank, allow_destroy: true
  accepts_nested_attributes_for :schedule, allow_destroy: true   accepts_nested_attributes_for :days, allow_destroy: true

  validates :name, :description, presence: true
end

我的路线:

Rails.application.routes.draw do

  devise_for :users
  resources :events do
      resources :schedules
  end

  resources :schedules do
    resources :days
  end

  root "page#home"
end

2 个答案:

答案 0 :(得分:1)

您在@schedule操作中定义create,但在调用new操作后呈现表单,这意味着此@schedule未定义点。

我尝试坚持使用new / create的rails约定,看起来像

class DaysController
  def new
    @day = Schedule.find(params[:schedule_id]).days.new
  end

  def create
    @day = Day.new(params[:day])
    if @day.save
      redirect_to days_path # or wherever you want to go
    else
      render 'new'
    end
  end
end

更清楚的是,事件的顺序是:

  • 访问days#new路径
  • ,呼叫/schedule/:schedule_id/days/new操作
  • 表单已呈现
  • 用户输入值和点击提交&#39;
  • 这会调用days#create操作
  • 新日期是根据用户在表单中输入的值创建的。

答案 1 :(得分:0)

你在哪里看到错误?对于加载表单或提交表单的操作?

如果错误发生在加载表单的操作期间,请检查 @schedule 是否为零。

如果提交,则可能是您的数据有问题或再次调试以找出@schedule为零的原因。

简单的测试方法是使用 rails console 。使用网址中的ID

$ schedule = Schedule.find(3)
 # returns nil or the schedule object. if its nil then there is a problem with your data. 
$ schedule.days