9

コントローラーからモデルにデータを渡すにはどうすればよいですか?

application_controllerの場合、ユーザーの場所 (州と都市) をbefore_filter取得し、すべてのコントローラーでアクセスできるようにするために a を含めます。

before_filter :community

def community
    @city = request.location.city
    @state = request.location.state
    @community = @city+@state
  end

次に、コントローラーで取得したデータを次の方法でモデルに追加してみます。

before_save :add_community

def add_community
      self.community = @community
    end

ただし、データがコントローラーからモデルに到達することはありません。私が使用する場合:

def add_community
    @city = request.location.city
    @state = request.location.state
    @community = @city+@state
    self.community = @community
  end

メソッドrequest.location.cityrequest.location.stateは、モデルからは機能しません。とを文字列として の下に定義する@cityと、動的変数がなく、モデルに文字列が配置されていることを除いて、すべてが機能するため、他のすべてが機能していることがわかります。また、適切な動的情報を表示させることができるため、リクエストがコントローラー/ビューで機能していることもわかっています。問題は、コントローラーからモデルにデータを取得することだけです。お時間をいただきありがとうございます。@statedef_community

4

2 に答える 2

13

あなたが取り組んでいる概念は、責任を分離することに関するMVC アーキテクチャです。モデルは、使用されているコンテキスト (HTTP 要求であるかどうかにかかわらず) を知る必要なく、DB (または他のバックエンド) との対話を処理する必要があり、ビューはバックエンドについて知る必要がなく、コントローラー2 つの間の相互作用を処理します。

したがって、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それが知っているのは、 と を取得していることだけcityですstate

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

于 2012-04-19T22:08:01.560 に答える