9

Wie leiten Sie Daten von einem Controller an ein Modell weiter?Wie leiten Sie Daten von einem Controller an ein Modell mit Ruby on Rails weiter?

In meinem application_controller packe ich die Position des Benutzers (Land und Stadt) und beinhalten ein before_filter es zugänglich in allen über

meine Controller zu machen
before_filter :community 

def community 
    @city = request.location.city 
    @state = request.location.state 
    @community = @[email protected] 
    end 

Dann versuche ich, die in der Steuerung zum Modell abgerufenen Daten hinzufügen via:

Die Daten gehen jedoch nie vom Controller zum Modell. Wenn ich benutze:

def add_community 
    @city = request.location.city 
    @state = request.location.state 
    @community = @[email protected] 
    self.community = @community 
    end 

Die Methoden request.location.city und request.location.state nicht aus dem Modell funktionieren. Ich weiß, dass alles andere funktioniert, denn wenn ich @city und @state als Strings unter def_community definiere, dann funktioniert alles, außer ich habe keine dynamische Variable, nur eine Zeichenfolge im Modell platziert. Außerdem weiß ich, dass die Anfragen in den Controllern/Ansichten funktionieren, weil ich sie dazu bringen kann, die richtigen dynamischen Informationen anzuzeigen. Das Problem besteht einfach darin, die Daten vom Controller zum Modell zu übertragen. Vielen Dank für Ihre Zeit.

+0

Ich schlage vor, Sie diese Frage oder Ihre anderen löschen, da sie im Wesentlichen die gleichen sind. Nächstes Mal, wenn Sie die Dinge klarer machen möchten, können Sie einfach Ihre ursprüngliche Frage bearbeiten: http://stackoverflow.com/questions/10236645/getting-methods-that-work-in-controller-views-to-function-in -a-model-ruby-on-ra – tsherif

+0

Willkommen bei StackOverflow! Denken Sie daran, alle Antworten aufzufrischen, die Sie nützlich finden, einschließlich Antworten auf Fragen anderer. "Check" (wählen Sie) die beste Antwort auf Ihre Fragen. –

Antwort

13

Das Konzept, mit dem Sie kämpfen, ist MVC architecture, die über die Trennung von Verantwortlichkeiten ist. Die Modelle sollten die Interaktion mit der Datenbank (oder einem anderen Back-End) ohne Kenntnis des Kontextes, in dem sie verwendet werden (egal ob HTTP-Anforderung oder nicht), Ansichten, die nicht über das Back-End wissen müssen, und Controller verwalten handle Interaktionen zwischen den beiden.

Im Fall Ihrer Rails-App haben die Ansichten und Controller Zugriff auf das Objekt request, während dies bei Ihren Modellen nicht der Fall ist. Wenn Sie Informationen von der aktuellen Anfrage an Ihr Modell weitergeben möchten, liegt es an Ihrem Controller, dies zu tun. Ich würde Ihre add_community wie folgt definieren:

class User < ActiveRecord::Base 

    def add_community(city, state) 
    self.community = city.to_s + state.to_s # to_s just in case you got nils 
    end 

end 

Und dann in Ihrem Controller:

class UsersController < ApplicationController 

    def create # I'm assuming it's create you're dealing with 
    ... 
    @user.add_community(request.location.city, request.location.state) 
    ... 
    end 
end 

Ich möchte nicht das request Objekt direkt passieren, denn das ist wirklich die Trennung des Modells von der aktuellen unterhält anfordern. Das User Modell muss nicht über request Objekte oder wie sie funktionieren. Alles was es weiß ist, dass es eine city und eine state bekommt.

Hoffe, dass hilft.

+3

+1 für "to_s nur für den Fall, dass Sie Nils haben" –

+1

Alles funktioniert jetzt, vielen Dank: D. – Laser

+1

@Laser Froh, es zu hören :) Happy coding! – tsherif

3

Die Klasseninstanzvariablen (die mit @ beginnen) in den Controllern sind von denen in den Modellen getrennt. Dies ist das Modell gegenüber dem Controller in der MVC-Architektur. Das Modell und der Controller (und die Ansicht) sind getrennt.

Sie verschieben Informationen explizit von einem Controller zu einem Modell.In Rails und anderen objektorientierten Systemen, haben Sie mehrere Möglichkeiten:

Verwenden Funktionsparameter

# In the controller 
user = User.new(:community => @community) 

# In this example, :community is a database field/column of the 
# User model  

Docs

Verwenden Instanzvariablen Attribut-Setter

# In the controller 
user = User.new 
user.community = @community 
# same as above, :community is a database field 

Pass ing Daten Modelle, wenn die Daten nicht ein Datenbankfeld

# In the model 
class User < ActiveRecord::Base 
    attr_accessor :community 
    # In this example, :community is NOT a database attribute of the  
    # User model. It is an instance variable that can be used 
    # by the model's calculations. It is not automatically stored in the db 

# In the controller -- Note, same as above -- the controller 
# doesn't know if the field is a database attribute or not. 
# (This is a good thing) 
user = User.new 
user.community = @community 

Docs

Verwandte Themen