2011-01-27 96 views
1

我一直在構建一個比賽應用程序,並且我可以很容易地告訴我一直在控制器中放置wayyyy太多的邏輯。我怎樣才能將這種類型的邏輯切換到模型? (這裏最重要的不是邏輯本身 - 它遠沒有完成 - 我只是想了解如何將它從控制器中移出)。將邏輯從控制器移動到導軌3中的模型?

控制器:

def create 
    @person = Person.new(params[:person]) 
    @yournum = rand(100) 
    @day = Day.find_by_id(1) 
    @prereg = Prereg.find_by_email(@person.email) 

    if @preg != nil 
     @person.last_name = @prereg.name 
    end 

    if @day.number == 1 


     if @yournum <= 25 
     @person.prize_id = 2 
     elsif @yournum > 25 && @yournum <=50 
     @person.prize_id = 1 
     elsif @yournum > 51 && @yournum <=75 
     @person.prize_id = 3 
     elsif @yournum > 76 && @yournum <=100 
     @person.prize_id = 4 
     end 

    elsif @day.number == 2 

     if @yournum <= 25 
     @person.prize_id = 2 
     elsif @yournum > 25 && @yournum <=50 
     @person.prize_id = 1 
     elsif @yournum > 51 && @yournum <=75 
     @person.prize_id = 3 
     elsif @yournum > 76 && @yournum <=100 
     @person.prize_id = 4 
     end 

    elsif @day.number == 3  

     if @yournum <= 50 
     @person.prize_id = 2 
     elsif @yournum > 51 && @yournum <=90 
     @person.prize_id = 1 
     elsif @yournum > 91 && @yournum <= 95 
     @person.prize_id = 3 
     elsif @yournum > 96 && @yournum <=100 
     @person.prize_id = 4 
     end 

    end 

    @person.save 
    redirect_to @person 

    end 

型號:

class Person < ActiveRecord::Base 
    belongs_to :prize 

end 

謝謝!

Elliot

回答

3

確實,這是一個非常醜陋的控制器。正如你所說,該解決方案很簡單:把所有的邏輯模型:

def create 
    @person = Person.new(params[:person]) 
    @person.set_price 

    if @person.save 
    redirect_to @person 
    else 
    flash[:error] = ... 
    render :action => 'new' 
    end 
end 

class Person 
    def set_price 
    # your logic here 
    end 
end  

需要注意的是:

  1. 控制器:你需要檢查,如果@person實際上是保存(也許一些驗證失敗)。
  2. 型號:如果一個人總是被分配一個創建價格,然後使用回調(例如before_validation)。否則,請按照上面的代碼所示從控制器中調用它。
1
class PersonsController < ApplicationController 
    respond_to :html 
    def create 
    @person = Person.new(params[:person]) 

    if @person.save 
     respond_with @person 
    else 
     flash[:error] = 'Render error' 
     render :action => :new 
    end 
    end 
end 

class Person 
    before_create :method_name 

    def method_name 
    #Put whatever you want to happen before creation here 
    end 
end 
相關問題