9

¿Cómo se transfieren los datos de un controlador a un modelo?¿Cómo se pasan los datos de un controlador a un modelo con Ruby on Rails?

En mi application_controller agarro la ubicación del usuario (estado y ciudad) e incluyen un before_filter para que sea accesible en todos mis controladores vía

before_filter :community 

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

Entonces trato añadir los datos recuperados en el controlador para el modelo a través de:

before_save :add_community 

def add_community 
     self.community = @community 
    end 

Los datos, sin embargo, nunca pasan del controlador al modelo. Si utilizo:

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

Los métodos request.location.city y request.location.state no funcionan a partir del modelo. Sé que todo lo demás está funcionando porque si defino @city y @state como cadenas, bajo def_community, todo funciona, excepto que no tengo una variable dinámica, solo una cadena colocada en el modelo. Además, sé que las solicitudes están funcionando en el controlador/vistas, porque puedo hacer que muestren la información dinámica adecuada. El problema es simplemente obtener los datos del controlador para el modelo. Muchas gracias por su tiempo.

+0

sugiero que elimine esta cuestión o su otro uno, ya que son esencialmente los mismos. La próxima vez, si quiere aclarar las cosas, puede simplemente editar su pregunta original: http://stackoverflow.com/questions/10236645/getting-methods-that-work-in-controller-views-to-function-in -a-model-ruby-on-ra – tsherif

+0

¡Bienvenido a StackOverflow! Recuerde votar todas las respuestas que le parezcan útiles, incluidas las respuestas a las preguntas de los demás. "Marque" (seleccione) la mejor respuesta a sus preguntas. –

Respuesta

13

El concepto con el que luchas es MVC architecture, que trata de separar las responsabilidades. Los modelos deben manejar la interacción con el DB (u otro servidor) sin necesidad de conocer el contexto en el que se utilizan (ya sea una solicitud HTTP o de otro tipo), las vistas no deberían necesitar información sobre el backend y los controladores. manejar las interacciones entre los dos.

Por lo tanto, en el caso de la aplicación Rails, las vistas y los controladores tienen acceso al objeto request, mientras que los modelos no. Si desea pasar información de la solicitud actual a su modelo, le corresponde a su controlador hacerlo. Yo definiría su add_community de la siguiente manera:

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 

Y luego, en su controlador:

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 

prefiero no pasar el objeto request directamente, ya que realmente mantiene la separación entre el modelo de los actuales solicitud. El modelo User no necesita conocer los objetos request ni cómo funcionan. Todo lo que sabe es que está obteniendo un city y un state.

Espero que ayude.

+3

+1 para "to_s en caso de que tenga nils" –

+1

Todo funciona ahora, muchas gracias: D. – Laser

+1

@Laser Me alegro de escucharlo :) ¡Feliz codificación! – tsherif

3

Las variables de instancia de clase (las que comienzan con @) en los controladores son independientes de las de los modelos. Este es el modelo frente al controlador en la arquitectura MVC. El modelo y el controlador (y la vista) están separados.

Mueve información de un controlador a un modelo explícitamente.En Rails y otros sistemas orientados a objetos, tiene varias opciones:

uso Parámetros de la función

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

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

Docs

Usar variables de instancia de atributo set

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

Pass ción de datos a los modelos cuando los datos no es un campo de base de datos

# 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

Cuestiones relacionadas