Rails 4 form_for双嵌套注释

首先,我已经找到了一些非常有用的答案(见下面的链接),但我仍然在努力使这项工作成功。 我没有长时间编程,这绝对是我觉得自己理解的理解。

我有三个型号。 例如,我称之为Tree,Bark,Engraving(评论)。 我正在尝试添加一个简单的表单部分供用户提交新评论(雕刻)。

以下设置产生错误:

/ trees / 1的NoMethodError未定义的方法`tree’表示nil:NilClass

控制器

class TreesController  @bark) end end class BarksController  @bark) @engravings = Engraving.where(bark_id: @bark.id) end end class EngravingsController < ApplicationController def show @bark= Bark.find(params[:bark_id]) @engraving = Engraving.new(params[:engraving]) end end def create @bark = Bark.find(params[:bark_id]) @engraving = Engraving.new(params[:engraving]) @engraving.user_id = current_user.id respond_to do |format| if @engraving.save format.html { redirect_to tree_bark_path(@tree, @bark), notice: 'Comment was successfully created.' } format.json { render action: 'show', status: :created, location: @engraving} else format.html { render action: 'new' } format.json { render json: @engraving.errors, status: :unprocessable_entity } end end 

结束

楷模

 class Tree < ActiveRecord::Base belongs_to :user has_many :barks has_many :engravings, through: :barks end class Bark :tree, :prefix => true def new_engraving_path Rails.application.routes.url_helpers.new_tree_bark_engraving_path(book, self) end def serializable_hash(*args) super.merge 'new_engraving_path' => new_engraving_path end end class Engraving :bark, :prefix => true def to_edit_path Rails.application.routes.url_helpers.edit_tree_bark_engraving_path bark_tree, bark, self end def to_path Rails.application.routes.url_helpers.tree_bark_engraving_path bark_tree, bark, self end def serializable_hash(*args) super.merge 'path' => to_path, 'edit_path' => to_edit_path end end 

在视图中调用表单

在树秀页面上,我有所有的树皮在那里填充。 单击Bark元素将打开一个模态,其中显示Bark.content和Engravings。 在最后的Engraving中,我希望有一个text_area表单来创建一个新的Engraving,并将它添加到这个“片段”的树皮中。

 # trees\show.html.erb  # barks\_bark.html.erb  # barks\modal.html.erb  bark.engravings %> # Form partial  (new_tree_bark_engraving_path(:tree_id => @bark.tree, :bark_id => @bark.id)) do |f| %>  

路线

  get "pages/home" resources :trees do collection do get 'search' post 'load_from_api' end resources :barks do resources :engravings end end resources :barks do resources :engravings end root "trees#index" 

其他答案来源

嵌套form_for的Rails路由错误

两次嵌套资源Form_For问题

具有嵌套资源的form_for

你的错误消息NoMethodError at /trees/1 undefined method 'tree' for nil:NilClass意味着你必须在一个nil对象上调用.tree 。 我能看到发生的唯一地方是局部forms。 我假设@bark.tree失败了。

从您的问题来看,不清楚哪个控制器正在渲染部分控制器,但最可能的原因是@bark没有被传递到表单中。 确保你将@bark传递给你的部分,这是一个例子:

 <%= render partial: "form", locals: {bark: @bark} %> 

你在树上@barks @barks @barks trees#show action ,但绝不是@bark

def show @barks = Bark.where(tree_id: @tree.id) @engraving= Engraving.new( :bark=> @bark) end

所以@bark是零。