2017-12-05 1 views
0

Ich suche einen neuen Datensatz innerhalb einer verschachtelten Ressource in Schienen wie nach http://guides.rubyonrails.org/routing.html zu erstellen.Wie Sie Daten von einem neuen Objekt in einer verschachtelten Ressource in Schienen speichern?

Mein Modell ist:

class Entry < ApplicationRecord 
    belongs_to :user 
    belongs_to :event 

class User < ApplicationRecord 
    has_many :entries, dependent: :destroy 

class Event < ApplicationRecord 
    has_many :entries, dependent: :destroy 

Und ich habe meine Route erklärt als

Rails.application.routes.draw do 
    resources :users 
    resources :events do 
     resources :entries 
    end 

Was die Syntax für die Einträge Controller ist für mich in der Lage zu sein, einen Eintrag auf einen Link zu erstellen wie events/2/entries/new. Dies ist, was ich habe versucht:

class EntriesController < ApplicationController 

def new 
    @entry = Entry.new 
end 


def create 
    @entry = Entry.new(params[:entry]) 
    if @entry.save 
     redirect_to @user 
     flash.now[:info] = "Event Created" 
    else 
     render '/create' 
     flash.now[:danger] = "Somthing went wrong" 
    end 
end 


    def entry_params 
     params.require(:event_id).permit(:siCard, :course) 
    end 

end 

On von new.html.erb ich

bin mit
<%= form_for(new_event_entry_path) do |f| %>. 

Aber ich kann es nicht als No route matches [POST] "/events/1/entries/new" Vielen Dank

+1

"Ich kann es nicht zur Arbeit bringen", was macht es oder nicht? Irgendwelche Fehler im Protokoll? Ich denke, dass 'new_event_entry_path' an eine Ereignisinstanz übergeben werden sollte und möglicherweise nur' event_entry_path' sein sollte, was bei einem Post, glaube ich, zum create path führt ... double check 'bin/rake routes' und stellen Sie sicher, dass der Name des Helfers dem Pfad (und Controller/Aktion) entspricht, den Sie zu –

+0

'Keine Route entspricht [POST]"/Ereignisse/1/Einträge/neu "' @Simple Lime –

+0

form_for sollte die Instanzvariable übergeben werden '@ Eintrag'. z.B. 'form_for (@entry)'. Die Instanzvariable sollte aus der Verschachtelung z.B. '@event = Event.find (params [: event_id]); @entry = @ event.entries.build' Ich habe keine Ahnung, wie Sie in diesem Fall auf "user" zugreifen, aber das sollte auch in das Entry-Objekt eingebaut sein. – engineersmnky

Antwort

0

Die Route, die Sie zur Verfügung gestellt haben, um die Arbeit in form_for akzeptiert keine POSTs. Sie haben die Route angegeben, die die Seite new rendert, nicht die Route, die neue Datensätze akzeptiert, also die Route create. Verwenden Sie dazu den Routenhelfer event_entries_path(@event).

Bei verschachtelten Ressourcen sollte das erste Argument von form_for ein Array sein: <%= form_for([@event, @entry], .... Rails wählt auf intelligente Weise die Route aus, die Sie benötigen, basierend darauf, ob die @entry beibehalten wird oder nicht.

+0

Sorry, ich verstehe, dass mein 'form_for' falsch ist, sagst du, das sollte durch' form_for ([@ event, @entry], event_entries_path (@event)) ersetzt werden ' –

+0

Benutze' form_for ([@ event, @ Eintritt]) do –

Verwandte Themen