Перемещение логики с контроллера на модель в рельсах 3? - PullRequest
1 голос
/ 27 января 2011

Я создавал конкурсное приложение, и я могу легко сказать, что я слишком много логию в контроллере.Как я могу переключить этот тип логики на модель?(здесь важна не сама логика - она ​​далека от завершения - я просто пытаюсь понять, как вывести ее из контроллера).

Контроллер:

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

Ответы [ 2 ]

3 голосов
/ 27 января 2011

Действительно, это довольно уродливый контроллер. Как вы говорите, решение простое: перенесите всю логику в модель:

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 голос
/ 27 января 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...