轨道4条的form_for双重嵌套评论(Rails 4 form_for double nested

2019-10-21 02:34发布

首先,我发现已经有一些非常有用的答案(见下面的链接),但我仍然在努力使这项工作。 我还没有被编程为长,这绝对拉伸什么,我觉得舒服自称了解。

我有三个型号。 例如起见,我会打电话给他们树,树皮,雕刻(的意见)。 我想添加一个简单的形式,部分供用户提交新的评论(雕刻)。

以下设置是制造误差:

NoMethodError在/株/ 1未定义的方法`为无树”:NilClass

控制器

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

class BarksController < ApplicationController
  def show
   @engravin= Engraving.new( :bark=> @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< ActiveRecord::Base
  belongs_to :user
  belongs_to :tree
  has_many :engravings

  delegate :title, :link, :to => :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< ActiveRecord::Base
  belongs_to :user
  belongs_to :bark

  delegate :tree, :to => :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.content和雕刻被示出。 在过去的雕刻,我想有一个text_area形式来创建一个新的雕刻,并把它添加到这个树皮的“作品”。

# trees\show.html.erb
<%= render @barks %>

# barks\_bark.html.erb
<%= render partial: 'barks/modal', locals: { bark: bark} %>

# barks\modal.html.erb
<% render partial: '/engravings/simpleForm', :collection => bark.engravings %>

# Form partial

  <%= form_for @engraving, :url => (new_tree_bark_engraving_path(:tree_id => @bark.tree, :bark_id => @bark.id)) do |f| %>
    <%= f.hidden_field :bark_id %> 

     <div class="field">
      <%= f.text_area :content %>
     </div>

     <div class="actions">
      <%= f.submit %>
     </div>
  <% end %>

路线

    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"

对方的回答来源

Rails使用嵌套的form_for路由错误

两次嵌套资源的form_for问题

嵌套资源的form_for

Answer 1:

您的错误信息NoMethodError at /trees/1 undefined method 'tree' for nil:NilClass意味着什么地方,你必须调用.tree一个上nil对象。 我可以看到,发生的唯一地方是在形式部分。 我假设@bark.tree失败。

从你的问题,目前尚不清楚哪个控制器渲染从局部的,但最可能的原因是@bark没有被传递到形式。 请确保您传递@bark到您的部分,下面是一个例子:

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


Answer 2:

你definining @barkstrees#show action ,但从来没有@bark

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

所以@bark为零。



文章来源: Rails 4 form_for double nested comments