2016-09-13 1 views
0

Ich muss einen Wert übergeben, um in einem Modell von einem anderen Controller ohne direkte Beziehung zwischen ihnen zuzuordnen. Im folgenden Beispiel muss ich farming_year im Field Model vom Planting Controller aktualisieren.RoR: Update-Attribut in einem Modell von einem nicht verwandten Controller

The Field Modell:

class Field < ApplicationRecord 
    has_many :crops 
    attr_accessor :farming_year 

    def getting_crops 
    @crops_list = Crop.select('crops.name').where(field_id: self.id, year: self.get_farming_year) # doesn't get the farming_year 
    end 
    def get_farming_year 
    @farming_year # passing the value directly will work @farming_year=2015!! 
    end 
    def farming_year=(val) 
    @farming_year = val # passing the value directly won't work @farming_year=2015!! 
    end 
end 

Im Pflanz Controller:

def new 
    @field = Field.new 
    @field.farming_year = session[:working_year] 
    @field.save 
    flash.now[:success] = @field.get_farming_year # it works and gives the correct year 
end 

, wenn ich die @farming_year im get_farming_year Methode @ farming_year = 2016 geändert wird, dann wird der Code arbeiten und Geben Sie die korrekten Crops-Datensätze ein. Die Flash-Nachricht im obigen Code ohne Änderung gibt das richtige Jahr aus dem Modell. Ich denke, mein Hauptproblem besteht darin, das Landwirtschaftsjahr von der get_farming_year-Methode zur getting_crops-Methode zu leiten.

Hinweis: das Rahmenjahr gehört zum Feld Crop nicht zum Feld, also muss ich es nicht zur Feldtabelle hinzufügen.

Irgendwelche Ideen, wie man das erreicht?

+0

Rails/Ruby-Versionen? – ArtOfCode

+0

speichern Sie das Feld? '@ field.save' –

+0

Ich benutze Schienen 5 – Yousef

Antwort

0

Das Hauptproblem mit meinem Code war die Verwendung von attr_accessor, die ich nicht brauchte, also habe ich "attr_accessor: farming_year" durch eine Klassenvariable "@@ work_year = ''" ersetzt und den Getter und aktualisiert Setter-Methode wie im folgenden Code

The Field Modell:

class Field < ApplicationRecord 
has_many :crops 
attr_accessor :farming_year 
@@work_year ='' 

def getting_crops 
    @crops_list = Crop.select('crops.name').where(field_id: self.id, year: farming_year) #now this can request the getter method and get the year 
end 
def farming_year # getter method 
    @@work_year ||= '' 
end 
def farming_year=(val) #setter method 
    @@work_year = val 
end 
end 

im Pflanz Controller:

def new 
    @field = Field.new 
    @field.farming_year = session[:working_year] 
    #@field.save NO need for this line 
    flash.now[:success] = @field.farming_year 
end 

Vielen Dank für Ihre freundliche Unterstützung :)

0

Ihr Code weist eine Reihe von Problemen auf.

  1. attr_accessor

    Warum Sie eine attr_accessor verwenden? Sie sollten den Wert für ein Modellattribut in der Datenbank speichern. Wenn Ihr Feldmodell nicht bereits ein farming_year Attribut hat, erstellen Sie eine Migration in die Datenbank hinzufügen, indem Sie diese Befehle ausführen:

    $ rails g migration AddFarmingYearToField farming_year:integer 
    $ rails db:migrate 
    

    Wenn Sie mit Rails < = 4, verwendet rake db:migrate anstelle der zweiten Befehl.

    Dies bedeutet, dass Sie attr_accessor nicht verwenden müssen oder Getter und Setter definieren müssen.

  2. PlantingController#new

    Diese Methode funktioniert nicht für Sie, weil Sie nicht die richtigen Methoden definiert haben, und Sie sind nicht die Instanz zu speichern.

    In Ihrem Field Modell haben Sie eine farming_year Methode definiert, aber Sie haben keine farming_year= Verfahren definiert, das, was der Setter ist sein sollte. Ändern Sie Ihre farming_year Methodendefinition zu farming_year=. Alternativ, verwenden Sie die Methode, die ich in 1. beschrieben habe, dann müssen Sie nicht.

Stellen Sie sicher, dass das Modellobjekt sind Speicher, wenn Sie mit ihm fertig sind - Field#save nennen, die auf Erfolg und falsy bei Ausfall truthy zurück; Oder rufen Sie Field#save!, die bei Erfolg truthy zurückgibt und eine Ausnahme bei Fehler auslöst.

+0

freundlich, siehe die aktualisierte Frage, erster Punkt ist nicht in meinem Fall anwendbar, da das Jahr der Landwirtschaft nicht gehören die Feldtabelle. Zweitens ist PlantingController # neu korrekt definiert. Drittens, ich korrigiere die Methoden im Modell und ich habe Feld # Speichern in der Steuerung, aber immer noch Probleme. – Yousef

Verwandte Themen