2012-04-19 2 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

컨트롤러에서 모델로 전달할 수없는 이유는 무엇입니까? –

+0

요청이 컨트롤러에 전달되는 결과는 무엇입니까? 그 일을 어떻게 하죠? 컨트롤러에 정의하면 모델에 사용할 수 없습니다. – Laser

+0

[컨트롤러에서 Ruby on Rails 모델로 데이터를 전달하는 방법은 무엇입니까?] (http://stackoverflow.com/questions/10237388/how-do-you-pass-data-from-a-controller) 모델과 컨트롤러에 –

답변

2

나는 Rudi의 접근 방식에 동의하지만, 좀 더 설명을하겠다. 레슬링하는 개념은 책임을 분리하는 것에 관한 MVC architecture입니다. 모델은 사용중인 컨텍스트 (HTTP 요청이든 아니든)에 대한 지식이 없어도 DB (또는 다른 백엔드)와의 상호 작용을 처리해야하며, 뷰는 백엔드 및 컨트롤러에 대해 알 필요가 없어야합니다. 둘 사이의 상호 작용을 처리합니다.

레일즈 앱의 경우보기 및 컨트롤러가 request 개체에 액세스 할 수 있지만 모델은 그렇지 않습니다. 현재 요청의 정보를 모델로 전달하려면 컨트롤러가해야합니다. 그 정말 현재의 모델의 분리를 유지하므로

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 개체를 전달할 수 없습니다 : 컨트롤러에서 다음

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 

을 그리고 다음과 같이 나는 당신의 add_location를 정의 할 의뢰. User 모델은 request 개체 또는 작동 방식을 알 필요가 없습니다. 알고있는 것만 큼 citystate이됩니다.

희망이 있습니다.

0

요청 변수는 현재 HTTP 요청에 따라 달라 지므로 모델에서 사용할 수 없습니다. param으로 모델에 전달해야합니다.

+0

의 루비 온 레일 (ruby-on-rails) 모델이 있습니까? – Laser

+0

죄송합니다. 완전히 이해하지 못했습니다. "현재 HTTP 요청"에 의존하기 때문에 컨트롤러에서 요청을 수행하고 모델에 전달해야합니다. 첫 번째 데프는 컨트롤러에서, 두 번째는 모델에서, 그리고 게시 한 것에서 보았을까요? 아니면 완전히 오해 한 적이 있습니까? – Laser

관련 문제