3

Railsアプリケーションのリファクタリングを行っています。コントローラロジックをモデルに移動することに関する多くの投稿を読みましたが、試したときにいくつかの問題が発生しました。

私は助けが必要です

  1. 次のエラーの理由を理解する
  2. すべてのコントローラーロジックをモデルに正常に移動するには、どのドキュメントを読む必要があるかを知る必要があります

私はまだアプリケーションの主要なリファクタリングを行っていないので、最初に簡単なリファクタリングを試しました。

PostsController(前)

def create
    @post = Post.create(params[:post])
    @post.user_id = session[:user_id]
    @post.num_likes = 0
    @post.num_dislikes = 0
    @geoip = GeoIP.new("#{Rails.root.to_s}/db/GeoIP.dat").country(request.remote_ip)
    @post.user_location = @geoip.country_name
end

PostModel(新規)

before_save :initialize_post

def initialize_post
    self.user_id = session[:user_id]
    self.num_likes = 0
    self.num_dislikes = 0
    @geoip = GeoIP.new("#{Rails.root.to_s}/db/GeoIP.dat").country(request.remote_ip)
    self.user_location = @geoip.country_name
end

PostsController(新規)

def create
    @post = Post.create(params[:post])
end

session undefinedただし、 ANDなどのエラーが原因で、この単純なリファクタリングでも実行できませんでしたmethod request undefined。これらのアクションをモデルクラスで使用できない理由がわかりません。

誰かがこの背後にある理由を説明し、スムーズなリファクタリングプロセスを実行するのに役立ついくつかの優れたドキュメントに私を導くことができますか?

どうもありがとう。

4

2 に答える 2

3

あなたのコントローラーのために、私は次のようなことをします。

def create
    @post = Post.new(params[:post])
    @post.user_id = session[:user_id]
    @post.ip_address = request.remote_ip
    @post.save
end

そしてあなたのモデル..のようなもの;

attr_accessor :ip_address
before_create :set_default_values
before_save :geo_locate

private

def geo_locate
    @geoip = GeoIP.new("#{Rails.root.to_s}/db/GeoIP.dat").country(self.ip_address) rescue nil
    self.user_location = @geoip.country_name unless @geoip.blank?
end

# This only runs when a new record is created. Alternatively, look into setting a default value on your database columns!
def set_default_values
  self.num_likes = 0
  self.num_dislikes = 0
end
于 2013-01-07T10:26:39.970 に答える
1

コントローラ内のすべてのコードをモデルに移動することはできません。セッション処理やリクエストなどの一部のコードは、コントローラーのみを対象としています。モデル内ではご利用いただけません。モデルレベルの処理のみに制限されている処理コードのみがモデルに含まれている必要があります。

以下は、レールコードをリファクタリングするのに最適な本です。

http://www.amazon.com/Rails-AntiPatterns-Refactoring-Addison-Wesley-Professional/dp/0321604814

于 2013-01-07T07:11:13.687 に答える