2014-10-02 4 views
1

우선, 도움이되는 몇 가지 답변을 이미 찾았지만 (아래 링크 참조), 아직이 작업을하기 위해 애 쓰고 있습니다. 나는 오랫동안 프로그래밍을 해오 지 않았으며 이것은 이해하기 쉽다고 느끼는 것을 확실히 늘리고있다.레일 4 form_for 이중 중첩 된 코멘트

세 가지 모델이 있습니다. 예를 들어, 나무, 나무 껍질, 판화 (의견)라고 부를 것입니다. 사용자가 새로운 댓글 (판화)을 제출할 수 있도록 간단한 양식 부분을 추가하려고합니다. 에서

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가 채워져 있습니다. Bark 요소를 클릭하면 Bark.content와 Engravings가 표시된 모달이 열립니다. 마지막 판화에서, 나는 새로운 판화를 만들기 위해 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 Routing Error for nested form_for

Twice Nested Resource Form_For Issue

form_for with nested resources

답변

1

NoMethodError at /trees/1 undefined method 'tree' for nil:NilClassnil 개체에서 .tree으로 전화해야한다는 것을 의미합니다. 내가 볼 수있는 유일한 곳은 부분적인 형태입니다. 나는 @bark.tree이 실패하고 있다고 가정하고 있습니다.

질문에서 컨트롤러를 부분 렌더링하는 것이 분명하지 않지만 가능성이 가장 높은 원인은 @bark이 양식으로 전달되지 않는다는 것입니다. 당신이 당신의 부분에 @bark을 전달되었는지 확인 여기에 예입니다

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

감사합니다. 변수가 전달되었습니다. – user1573016

+0

양식이 여러 번 표시됩니다. 부분 호출을 확인했지만 그 부분은 아닙니다. 양식의 수는 이전에 제출 한 의견의 수와 같습니다.왜 댓글의 개수가 표시 할 양식의 수를 결정합니까? – user1573016

+0

문제는 부분 호출의 : 콜렉션입니다. 모두 고쳐! – user1573016

1

당신은 당신의 trees#show action@barks을 definining하고 있지만 그래서 @bark은 전무 @bark

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

하지 않습니다.