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 要求であるかどうかにかかわらず) を知る必要なく、DB (または他のバックエンド) との対話を処理する必要があり、ビューはバックエンドについて知る必要はありません。 2 つの間の相互作用を処理します。

したがって、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

それが役立つことを願っています。

于 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 に答える