2017-12-27 7 views
1

Ich bin in einem NoMethodError in meiner Users # Show bei dem Versuch, ein Formular teilweise für das Übermitteln eines Aufgabenelements (_form.html.erb) einzubeziehen. Mein anderer Teil (_item.html.erb) wird ordnungsgemäß gerendert. Mein Artikelmodell und mein Benutzermodell sind miteinander verknüpft, Benutzer has_many: items und item orders_to: user.NoMethodError in Benutzer # show (Ruby Rails)

Jede und alle Hilfe würde sehr geschätzt werden!

Unten finden Sie meine routes.rb

Rails.application.routes.draw do 
    get 'welcome/index' 

    get 'welcome/about' 

    root 'users#show' 

    resources :users do 
    resources :items, only: [:new, :create] 
    end 


    devise_for :users 
    # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 
end 

Unter meinem Terminal Ausgang

ActionView::Template::Error (undefined method `items_path' for #<#<Class:0x007fefeca61dd0>:0x007fefeca58b18> 
Did you mean? items_create_path): 
    1: <h4> Create a new to-do item </h4> 
    2: 
    3: <%= form_for @item do |f| %> 
    4: <%= f.label :name %> 
    5: <%= f.text_field :name, class: 'form-control', placeholder: "Enter task here" %> 

Artikel-Controller

class ItemsController < ApplicationController 

    def new 
     @item = Item.new 
    end 

    def create 
     @item = Item.new 
     @item.user = current_user 
     @item.name = params[:item][:name] 

     if @item.save 
      flash[:notice] = "Item saved" 
      redirect_to @item 
     else 
      flash.now[:alert] = "Item was not created, please try again." 
      render :new 
     end 
    end 
end 

Benutzer-Controller

class UsersController < ApplicationController 


    def show 
    if !current_user.nil? 
     @user = current_user 
     @item = Item.new 
     @items = @user.items 
    else 
     redirect_to new_user_registration_path 
    end 
    end 
end 
ist # 0

Benutzer zeigen Seite

<h2> Your to-do list</h2> 


    <div class="col-md-8"> 
    <div class='items'> 
     <%= render partial: "items/item", local: { item: @item} %> 
    </div> 
    </div> 
    <div class="col-md-8"> 
    <div class='new-item'> 
     <%= render partial: "items/form", local: { item: @item } %> 
    </div> 
    </div> 
+0

Änderung 'Ressourcen: Artikel, nur: [: neu,: create]' auf 'Ressourcen : nur Artikel: [: neu,: erstellen,: index] ' – Anthony

Antwort

1

In Ihrer routes.rb Datei, haben Sie Einzelteile als nested resource definiert. Sie können alle Ihre Routen überprüfen, indem Sie diesen Befehl auf Ihrem Terminal ausführen: rake routes.

Für Ihre Routen speziell, sagen Sie:

resources :users do 
    resources :items, only: [:new, :create] 
end 

Diese Sie Routen für GET /users/:user_id/items/new und POST /users/:user_id/items geben würde. In Ihrem Formular sieht es jedoch folgendermaßen aus: <%= form_for @item do |f| %>. Sie haben keine Route für einen Artikel definiert. Sie müssen auch einen Benutzer angeben.

Versuchen Sie dies für Ihre Form:

<%= form_for [@user, @item] do |f| %> 

Und so etwas in Ihren ItemsController:

class ItemsController 
    def new 
    @user = current_user 
    @item = Item.new 
    end 
end 
+0

Danke, deine Erklärung war klar und half mein Problem zu lösen! –

1

Ihre items Route unter users verschachtelt ist. daher müssen Sie beide an die form_for - ein Benutzer und ein Element übergeben.

So etwas wird wahrscheinlich funktionieren:

<%= form_for(current_user, @item) do |f| %> 
Verwandte Themen