2016-04-12 16 views
0

So habe ich eine verschachtelte Ressource, wobei todolist ist das übergeordnete und todoitem ist das Kind.Rails verschachtelte Ressource (neu)

resources :todolists do 
    resources :todoitems 
end 

Ich habe einen Add Todo List Link erstellt, wo es new_todolist_todoitem in routes.rb gefunden aufruft.

new_todolist_todoitem GET /todolists/:todolist_id/todoitems/new(.:format)  todoitems#new 

In meiner todolists/show.html.erb Datei, habe ich diese Zeile Code enthalten:

<%= link_to 'Add Todo Item', new_todolist_todoitem_path(@todolist.id) %> 

Und in meinem todoitems/_form.html.erb, habe ich auch die verschachtelten Parameter innerhalb der IT:

<%= form_for([@todolist, @todoitem]) do |f| %> --> Error is on this line 
    <% if @todoitem.errors.any? %> 
<div id="error_explanation"> 
    <h2><%= pluralize(@todoitem.errors.count, "error") %> prohibited this todoitem from being saved:</h2> 

In meiner todoitems_controller.rb stelle ich diese für new und create Methoden:

# GET /todoitems/new 
    def new 
    @todoitem = Todoitem.new 
    end 

    # POST /todoitems 
    # POST /todoitems.json 
    def create 
    @todoitem = @todolist.todoitems.new(:todoitem_params) 

    respond_to do |format| 
     if @todoitem.save 
     format.html { redirect_to @todoitem, notice: 'Todoitem was successfully created.' } 
     format.json { render :show, status: :created, location: @todoitem } 
    else 
     format.html { render :new } 
     format.json { render json: @todoitem.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

Das Problem ist, dass ich einen Fehler halte, die besagt:

undefined method `todoitems_path' for #<#<Class:0x007feaa79e8da8>:0x007feaa5d0d878> 

Wenn jemand eine mögliche Lösung hat dieses Problem oder Vorschläge zu beheben, wäre es sehr geschätzt. Vielen Dank!

P.S. Entsprechend der Stapelüberwachung ist die Parameteranforderung: {"todolist_id"=>"2"}

Antwort

0

Ein paar Dinge zu beachten und hoffentlich löst es Ihr Problem.

In Ihrem todolists/show.html.erb, können Sie die @todolist in Ihrem link_to

<%= link_to 'Add Todo Item', new_todolist_todoitem_path(@todolist) %>

Dann müssen einige Änderungen an Ihrem Controller gemacht werden nur passieren:

todoitems_controller.rb

before_action :set_todolist 

def create 
    @todoitem = Todoitem.new(todoitem_params) 

    # Assuming Todoitem belongs_to Todolist 
    @todoitem.todolist_id = @todolist.id 
    ... 
end 

private 

def set_todolist 
    @todolist = Todolist.find(params[:todolist_id] 
end 

Fabrikat sicher, dass deine params auch korrekt sind.

1

Sie setzen keine @todolist Instanzvariable in Ihrem Controller-Code, aber Sie verwenden sie im form_for [@todolist, @todoitem]-Tag. Stellen Sie sicher, dass Sie einen Satz in Ihrem Controller haben. Normalerweise ist es in der before_filter wie folgt gemacht:

class Todoitem 
    before_filter :set_todolist 

    def set_todolist 
    @totolist = Todolist.find(params[:todolist_id]) 
    end 
end 
+0

Was, wenn ich das schon getan habe? Ich habe nur vergessen, es in diese Frage aufzunehmen. Kann ich noch etwas anderes machen? Ich habe überprüft, ob es einen Schreibfehler gab, aber es gab keine ... @uzbekjon – ETUDESC

+0

Okay, mal sehen. Sie erhalten den Fehler 'todoitems_path undefined'. Das bedeutet, dass Ihr Code versucht, auf diesen Pfad zuzugreifen. Lass uns herausfinden, wo genau das passiert. Könnten Sie bitte eine vollständige Stapelverfolgung Ihres Fehlers hinzufügen? – Uzbekjon

+0

Oh, ich bin gerade bei der Arbeit, aber ich werde es gerne veröffentlichen, sobald ich zurück bin ... haha ​​@uzbekjon – ETUDESC

Verwandte Themen