你如何从控制器到模型传递数据?
在我application_controller
我抢用户的位置(州,市)和包括before_filter
,使其在通过我的所有控制器入店
before_filter :community
def community
@city = request.location.city
@state = request.location.state
@community = @city+@state
end
然后我尝试添加控制器通过模型检索的数据:
before_save :add_community
def add_community
self.community = @community
end
该数据,但是,从来没有让从控制器到模型的方式。 如果我使用:
def add_community
@city = request.location.city
@state = request.location.state
@community = @city+@state
self.community = @community
end
该方法request.location.city
和request.location.state
不从模型中发挥作用。 我知道这一切工作,因为如果我定义@city
和@state
为字符串,下def_community
,然后一切正常,除了我没有一个动态的变量,只是放置在模型的字符串。 另外,我知道这些请求在控制器/视图的工作,因为我可以让他们来显示适当的动态信息。 这个问题仅仅是从控制器到模型中获取数据。 非常感谢您的时间。
你摔跤的概念是MVC架构 ,大约是分离的责任。 该模型应该处理与数据库(或其它后端)交互,而无需他们在所使用的上下文的任何信息(无论它是一个HTTP请求或其他方式),视图不应该需要了解的后端,和控制器处理好两者之间的相互作用。
因此,在您的Rails应用程序的情况下,视图和控制器可以访问request
对象,而您的模型没有。 如果你想从当前请求到模型传递信息,它是由控制器这样做。 我会定义add_community
如下:
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
然后在你的控制器:
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
我不想通过request
直接对象,因为真正保持模型的当前请求的分离。 该User
模型并不需要了解request
对象以及它们如何工作。 它只知道它得到一个city
和一个state
。
希望帮助。
在控制器的类的实例变量(那些以@开始),从那些在模型分开。 这是该型号VS中的MVC架构控制器。 模型和控制器(和视图)是分开的。
您可以从一个控制器移动信息到模型明确。 在Rails和其他面向对象的系统,你有几种选择:
使用功能参数
# In the controller
user = User.new(:community => @community)
# In this example, :community is a database field/column of the
# User model
文件
使用实例变量属性setter方法
# In the controller
user = User.new
user.community = @community
# same as above, :community is a database field
将数据传递到模型时的数据不是一个数据库字段
# 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
文件