9

如何將數據從控制器傳遞到模型?如何將數據從控制器傳遞到具有Ruby on Rails的模型?

在我application_controller我搶用戶的位置(州,市),幷包括一個before_filter讓它在我所有的控制器入店通過

before_filter :community 

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

然後我嘗試添加在控制器中檢索到模型中的數據通過:

before_save :add_community 

def add_community 
     self.community = @community 
    end 

然而,數據從來沒有從控制器到模型的方式。如果我使用:

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

的方法request.location.cityrequest.location.state不從模型中發揮作用。我知道其他一切都在工作,因爲如果我將@city@state定義爲字符串,則在​​下,除非我沒有動態變量,只是放置在模型中的字符串,否則一切正常。另外,我知道這些請求正在控制器/視圖中工作,因爲我可以讓它們顯示正確的動態信息。問題只是從控制器獲取數據到模型。非常感謝您的時間。

+0

我建議你刪除這個問題,或者你的另外一個,因爲他們基本上是相同的。下一次,如果你想使事情更清楚,你可以編輯你的原始問題:http://stackoverflow.com/questions/10236645/getting-methods-that-work-in-controller-views-to-function-in -a-model-ruby-on-ra – tsherif 2012-04-19 22:10:20

+0

歡迎來到StackOverflow!請記住點贊所有你認爲有用的答案,包括回答他人的問題。 「檢查」(選擇)您的問題的最佳答案。 – 2012-04-20 04:03:11

回答

13

你正在摔跤的概念是MVC architecture,這是關於分離責任。這些模型應該處理與數據庫(或其他後端)的交互,而不需要知道它們正在使用的上下文(無論是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。所有它知道的是得到citystate

希望有所幫助。

+3

+1「to_s以防萬一你有nils」 – 2012-04-20 07:38:51

+1

現在一切正常,非常感謝你:D。 – Laser 2012-04-20 19:18:41

+1

@激光很高興聽到它:)快樂的編碼! – tsherif 2012-04-20 19:51:48

3

控制器中的類實例變量(以@開頭的變量)與模型中的變量是分開的。這是MVC體系結構中的模型與控制器。模型和控制器(和視圖)是分開的。

您將信息從控制器顯式移動到模型。在Rails和其他面向對象的系統,你有幾種選擇:

使用功能參數

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

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

Docs

使用實例變量屬性制定者

# 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 

Docs

相關問題