我是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
答案 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
操作
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