9

如何将数据从控制器传递到模型?

在我的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能从模型中运行。我知道其他一切都在工作,因为如果我将@cityand定义@state为字符串,在 下def_community,那么一切正常,除了我没有动态变量,只是放置在模型中的字符串。另外,我知道请求在控制器/视图中工作,因为我可以让它们显示正确的动态信息。问题只是将数据从控制器获取到模型。非常感谢您的时间。

4

2 回答 2

13

您正在努力解决的概念是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对象或它们如何工作。它所知道的是它得到了 acity和 a state

希望有帮助。

于 2012-04-19T22:08:01.560 回答
4

控制器中的类实例变量(以 @ 开头的变量)与模型中的实例变量是分开的。这是 MVC 架构中的模型与控制器。模型和控制器(和视图)是分开的。

您将信息从控制器显式移动到模型。在 Rails 和其他面向对象的系统中,您有多种选择:

使用函数参数

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

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

文档

使用实例变量属性设置器

# 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

文档

于 2012-04-20T01:06:23.970 回答