2017-03-03 3 views
0

Was ich erreichen möchte ist, dass jedes Mitglied mit Schulen auflisten und danach Schulen mit allen zugehörigen Mitgliedern auflisten. Schulen können viele Mitglieder haben und Mitglieder können auch viele Schulen haben. Ich habe folgendes im System eingerichtet, habe aber Probleme die Lösung dafür zu finden. Hier ist es, wie mein Code wie folgt aussieht:Problem und Fehlermeldung: Konnte Schule mit 'ID' nicht finden =

Controller:

class MembersController < ActionController::Base 
    before_action :set_school 

    def index 
    @members = Member.all 
    end 

    def new 
    @member = Member.new 
    end 

    def create 
    @member = Member.new(member_params) 
    @member.school = @school 
    @member.save 
    redirect_to members_path 
    end 


    private 

    def set_school 
    @school = School.find(params[:school]) 
    end 

    def member_params 
    params.require(:member).permit(:name, :email,:school) 
    end 
end 

Das ist mein Weg ist:

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

    resources :members 
    resources :school 

end 

Meine Ansicht wie folgt aussieht:

<% @members.each do |member| %> 
    <%= member.name %> 
    <%= member.email %> 
    <%= member.school %> 
<% end %> 

Modell für Mitglieder:

class CreateMembers < ActiveRecord::Migration[5.0] 
    def change 
    create_table :members do |t| 
     t.string :name 
     t.string :email 
     t.timestamps 
    end 
    end 

mein Schulmodell:

class CreateSchools < ActiveRecord::Migration[5.0] 
    def change 
    create_table :schools do |t| 
     t.string :name 

     t.timestamps 
    end 

und die Referenz:

class AddSchoolRefToMembers < ActiveRecord::Migration[5.0] 
    def change 
    add_reference :members, :school, foreign_key: true 
    end 

Jede Hilfe wäre toll! Vielen Dank!

+0

Wie sollte die URL für Ihre neue Aktion aussehen? ist es 'example.com/members/new? school = someid' oder nur' example.com/members/new'? – niceman

+0

example.com/members/new – gerazoli

+0

@ashvin 'resources: members 'erlaubt Abfrage paramaters :) – niceman

Antwort

2
<%= simple_form_for [@member] do |f| %> 
    <%= f.input :name %> 
    <%= f.input :email %> 
    <%= f.collection_select :school_id, School.all, :id, :name %> 
    <%= f.submit %> 
<% end %> 

Ändern Sie die starke params

def member_params 
    params.require(:member).permit(:name, :email, :school_id) 
end 

Und Sie können die before_action :set_school

Entfernen Sie auch müssen Sie die Aktion ändern, wie school_id bereits in params ist

def create 
    @member = Member.create(member_params) 
    redirect_to members_path 
end 
+0

Danke Deepak, aber wie gibt man Wert dort drin?Ich habe in meiner Seed-Datei die Werte von Schulen Member.create! ({{Name: 'Star Wars'}, {E-Mail: '[email protected]'}]) School.create! (Name: ' Westminster ') School.create! (Name:' UCL ') School.create! (Name:' City ') – gerazoli

+0

@imocsari 'f.select' wird die Schule vom Benutzer bekommen :) – niceman

+0

Nach Ihrer bearbeiteten Antwort params für die Schule wird 'params [: Mitglied] [: Schule]' – ashvin

2

Sie haben set before_action für alle Aktionen im Controller. Für, index und neu gibt es keine school_id, also musst du before_action nur für create ausführen.

ändern Code unten

before_action :set_school 

zu

before_action :set_school, only: ['create'] 
+0

OP möchte die Schule in Abfrage paramaters übergeben :) – niceman

+0

Auf Aktion erstellen, müssen Sie die Schule passieren in Parameter. – puneet18

+0

Ich habe es geändert, aber jetzt habe ich folgendes: undefined Methode 'school = 'für nil: NilClass – gerazoli

0

@imocsari der Name der Schule, um Ihre Ansicht wie

ändern
<% @members.each do |member| %> 
<%= member.name %> 
<%= member.email %> 
<%= member.school.try(:name) %> 
<% end %> 

member.school geben Ihnen zugeordnet Schule-Mitglied Alle Spalte, wenn Sie den Namen der Schule zeigen möchten, ist dies member.school.try(:name) or member.school.name

member.school.try(:name) diese Null zurück, wenn es keine Schule für Mitglied ist, es durch Pass Ausnahme

member.school.name wird dieser Fehler ausgelöst wird, wenn es keine Schule für Mitglied ist.

Verwandte Themen