9

Come si passano i dati da un controller a un modello?Come si passano i dati da un controller a un modello con Ruby on Rails?

Nel mio application_controller Afferro la posizione dell'utente (stato e città) e includono un before_filter per renderlo accessibile a tutti i miei controllori tramite

before_filter :community 

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

Allora provo aggiungere i dati recuperati nel controllore al modello via:

before_save :add_community 

def add_community 
     self.community = @community 
    end 

I dati, tuttavia, non si spostano mai dal controller al modello. Se uso:

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

I metodi request.location.city e request.location.state non funzionano dal modello. So che tutto il resto funziona perché se definisco come stringhe, sotto , tutto funziona, eccetto che non ho una variabile dinamica, solo una stringa inserita nel modello. Inoltre, so che le richieste stanno funzionando nel controller/viste, perché posso farle visualizzare le corrette informazioni dinamiche. Il problema è semplicemente ottenere i dati dal controller al modello. Grazie mille per il vostro tempo.

+0

vi consiglio di eliminare questa domanda o il vostro altro, dato che sono essenzialmente la stessa. La prossima volta, se vuoi chiarire le cose, puoi semplicemente modificare la tua domanda originale: http://stackoverflow.com/questions/10236645/getting-methods-that-work-in-controller-views-to-function-in -a-model-ruby-on-ra – tsherif

+0

Benvenuti in StackOverflow! Ricordati di revocare le risposte che ritieni utili, comprese le risposte alle domande degli altri. "Verifica" (seleziona) la migliore risposta alle tue domande. –

risposta

13

Il concetto con cui stai lottando è MVC architecture, che riguarda la separazione delle responsabilità. I modelli devono gestire l'interazione con il DB (o altro back-end) senza che sia necessaria alcuna conoscenza del contesto in cui vengono utilizzati (sia che si tratti di una richiesta HTTP o altro), le visualizzazioni non devono essere informate sul back-end e sui controller gestire le interazioni tra i due.

Quindi, nel caso della tua app Rails, le viste e i controller hanno accesso all'oggetto request, mentre i tuoi modelli no. Se si desidera passare informazioni dalla richiesta corrente al modello, è compito del controllore farlo. Definirei il vostro add_community come segue:

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 

E poi nel 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 

preferisco non passare l'oggetto request direttamente, perché che mantiene davvero la separazione del modello dagli attuali richiesta. Il modello User non ha bisogno di conoscere gli oggetti request o come funzionano. Tutto quello che sa è che sta ottenendo un city e un state.

Spero che questo aiuti.

+3

+1 per "to_s nel caso abbiate preso nulla" –

+1

Tutto funziona ora, grazie mille: D. – Laser

+1

@Laser Felice di sentirlo :) Buona programmazione! – tsherif

3

Le variabili di istanza di classe (quelle che iniziano con @) nei controller sono separate da quelle dei modelli. Questo è il modello rispetto al controller nell'architettura MVC. Il modello e il controller (e la vista) sono separati.

Si spostano esplicitamente le informazioni da un controller a un modello.In Rails e altri sistemi orientati agli oggetti, sono disponibili diverse opzioni:

Utilizzare la funzione parametri

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

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

Docs

attribuiscono Utilizzare le variabili di istanza setter

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

Passo ing dati ai modelli quando i dati non è un campo di database

# 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

Problemi correlati