【问题标题】:Getting methods that work in controller/views to function in a model, Ruby on Rails让在控制器/视图中工作的方法在模型中运行,Ruby on Rails
【发布时间】:2012-05-01 11:21:37
【问题描述】:

我正在尝试根据用户的位置向位置列下的用户模型添加一个字符串。我已将所有设置都设置为我知道@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?非常感谢提前:)

【问题讨论】:

标签: ruby-on-rails ruby model-view-controller methods model


【解决方案1】:

我主要同意 Rudi 的方法,但我会提供更多解释。您正在讨论的概念是MVC architecture,这是关于分离职责的。模型应该处理与数据库(或其他后端)的交互,而不需要了解它们正在使用的上下文(无论是 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 对象或它们如何工作。它所知道的只是它得到了一个city 和一个state

希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 在模型还是控制器中?
    • 对不起,我不太明白。因为它取决于“当前 HTTP 请求”,所以请求必须在控制器中完成并传递给模型?那么根据您发布的内容,第一个 def 会进入控制器,第二个进入模型吗?还是我完全误解了?
    猜你喜欢
    • 2012-08-14
    • 2023-03-07
    • 2016-09-26
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    相关资源
    最近更新 更多