【问题标题】:Rails 4 form_for double nested commentsRails 4 form_for 双嵌套注释
【发布时间】:2014-11-27 01:29:01
【问题描述】:

首先,我已经找到了一些非常有用的答案(请参阅下面的链接),但我仍在努力完成这项工作。我已经很久没有编程了,这肯定是在扩展我自称理解的内容。

我有三个模型。例如,我将它们称为树、树皮、雕刻(cmets)。我正在尝试添加一个简单的部分表单供用户提交新的 cmets(雕刻)。

以下设置产生错误:

/trees/1 处的 NoMethodError nil: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 元素会打开一个模式,其中会显示 Bark.content 和 Engravings。在最后一个 Engraving 下,我想有一个 text_area 表单来创建一个新的 Engraving,并将其添加到这块“树皮”中。

# 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 Routing Error for nested form_for

Twice Nested Resource Form_For Issue

form_for with nested resources

【问题讨论】:

    标签: ruby-on-rails forms


    【解决方案1】:

    您在trees#show action 中定义了@barks,但从不定义@bark

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

    所以@bark 为零。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 谢谢!变量正在传入。
      • 表单现在显示多次。我已经检查了部分调用,但事实并非如此。表单的数量与之前提交的 cmets 的数量相同。为什么 cmets 的数量决定了要显示多少种形式?
      • 问题是部分调用中的 :collection 。现在都修好了!
      猜你喜欢
      • 2016-11-03
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多