0

我正在尝试根据用户的位置向位置列下的用户模型添加一个字符串。我已将所有设置都设置为知道@city+@state 的值已添加到正确模型中的相应列中。问题是,request.location.city 和 request.location.state 似乎在控制器和视图中正常运行,但在模型中却没有。

def add_location
      @city = request.location.city
      @state = request.location.state
      @location = @city+@state
      self.location = @location
    end

创建用户时,不会创建诸如“losangelescalifornia”之类的字符串,而是不会创建任何内容。当我定义@city = "bob" 和@state = "cat" 时,所有创建的用户在适当的位置都有"bobcat"。我知道除了这些基于地理位置的方法之外,一切都在运行。所以我的问题是,我将如何让这些方法(如果不是它们,请纠正我)在模型中发挥作用,即 request.location.city 和 request.location.state?提前谢谢了 :)

4

2 回答 2

2

大多数情况下,我同意 Rudi 的方法,但我会提供更多解释。您正在努力解决的概念是MVC 架构,它是关于分离职责的。模型应该处理与数据库(或其他后端)的交互,而不需要了解它们正在使用的上下文(无论是 HTTP 请求还是其他),视图不需要了解后端和控制器处理两者之间的交互。

因此,对于 Rails 应用程序,视图和控制器可以访问request对象,而模型则不能。如果你想将当前请求中的信息传递给你的模型,这取决于你的控制器。我将您的定义add_location如下:

class User < ActiveRecord::Base

  def add_location(city, state)
    self.location = 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_location(request.location.city, request.location.state)
    ...
  end
end

我不喜欢request直接传递对象,因为这确实保持了模型与当前请求的分离。该User模型不需要了解request对象或它们如何工作。它所知道的是它得到了 acity和 a state

希望有帮助。

于 2012-04-19T21:53:39.140 回答
0

request 变量在模型中不可用,因为它取决于当前的 HTTP 请求。您必须将模型作为参数传递给模型。

def your_action
  ...
  @model.add_location(request)
  ...
end

def add_location(request)
  .. 
end
于 2012-04-19T21:03:37.517 回答