2012-04-19 54 views
0

我想根據用戶位置將字符串添加到位置列下的用戶模型。我已經設置了一切,我知道@ city + @ state的值被添加到正確模型的相應列中。問題是,看起來request.location.city和request.location.state函數在控制器和視圖中正確,但不在模型中。在控制器/視圖中工作的方法在模型中運行,Ruby on Rails

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

當創建用戶而不是創建諸如「losangelescalifornia」之類的字符串時,不會創建任何內容。當我定義@city =「bob」和@state =「cat」時,所有創建的用戶在適當的位置都有「bobcat」。那麼我知道除了這些基於地理定位的方法之外,一切都在發揮作用。所以我的問題是,如何在模型中使用這些方法(請糾正我,如果這不是它們的功能),請問request.location.city和request.location.state?非常感謝提前:)

+0

爲什麼不能將它們從控制器傳遞到模型中? – 2012-04-19 21:02:58

+0

由控制器請求抓取的結果?我會怎麼做呢?如果我將它們定義在控制器中,則它們不適用於模型。 – Laser 2012-04-19 21:06:46

+0

[您如何將數據從控制器傳遞到具有Ruby on Rails的模型?](http://stackoverflow.com/questions/10237388/how-do-you-pass-data-from-a-controller -ruby-on-a-model-on-rails) – 2016-02-19 14:47:06

回答

2

我同意魯迪的做法,主要是,但我會提供一些更多的解釋。你摔跤的概念是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。它所知道的是它得到了citystate

希望有所幫助。

0

請求變量在模型中不可用,因爲它取決於當前的HTTP請求。 你必須傳遞給模型作爲參數。

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

def add_location(request) 
    .. 
end 
+0

在模型或控制器中? – Laser 2012-04-19 21:08:35

+0

對不起,我不完全明白。因爲它取決於「當前的HTTP請求」,所以請求必須在控制器中完成並傳遞給模型?從你發佈的內容開始,第一個def會在控制器中出現,第二個在模型中出現?還是我完全誤解了? – Laser 2012-04-19 21:12:51

相關問題