Rails и Redis: как мне здесь пройти валидацию? - PullRequest
0 голосов
/ 08 марта 2012

Я новичок в рельсах.Я использую Redis вместо чего-то поддержанного с ActiveRecord.Мне нужно проверить наличие местоположения, категории, start_date и end_date.Затем мне нужно проверить, что start_date и end_date являются действительными датами, что start_date предшествует end_date.И это местоположение соответствует регулярному выражению [A-Za-z_].И это category.length> 0. Поскольку параметры start_date и end_date в установщиках моей модели являются объектами Date, я должен проверить правильность дат и преобразовать их в моем контроллере.Тогда сеттеры моей модели позаботятся об остальной части проверки?

Я просто не знаю, куда поместить проверки: в моей модели или контроллере?

Я думал о создании моделей MyThingieX, MyThingieY и MyThingieZ, но это немного запутанно, поскольку .createсоздаст несколько значений ключа redis вместо одного ... обратите внимание на циклы for в каждом из методов set_ и "mset".

Модель:

class MyThingie
  def self.set_x(location, categories, start_date, end_date, value)
    updates = {}
    for date in (start_date .. end_date)
      # ...
    end

    $redis.mset(*updates.flatten)
  end

  def self.set_y(location, categories, default)
    updates = {}
    for category in categories
      # ...
    end

    $redis.mset(*updates.flatten)
  end

  def self.set_z(location, categories, start_date, end_date, block_category)
    if block_category
      updates = {}
      for date in (start_date .. end_date)
        # ...
      end

      $redis.mset(*updates.flatten)
    else
      deletes = []
      for date in (start_date .. end_date)
        # ...
      end

      $redis.del(*deletes)
    end
  end
end

Контроллер:

class MyThingieController < ApplicationController
  # ...

  def create
    begin
      method = params[:method]
      location = params[:location]
      categories = params[:categories]
      s_start_date = params[:start_date]
      s_end_date = params[:end_date]

      if method == "normal"
        value = params[:value]

        start_date = Date.strptime(s_start_date, "%m/%d/%Y")
        end_date = Date.strptime(s_end_date, "%m/%d/%Y")

        MyThingie.set_x(location, categories, start_date, end_date, value)
      elsif method == "default"
        default = params[:default]

        MyThingie.set_y(location, categories, default)
      elsif method == "block_category"
        block_category = params[:block_category] == "block_category"

        start_date = Date.strptime(s_start_date, "%m/%d/%Y")
        end_date = Date.strptime(s_end_date, "%m/%d/%Y")

        MyThingie.set_z(location, categories, start_date, end_date, block_category)
      else
        raise "Invalid form submit"
      end
    rescue Exception => e
      errors = [e.message]
      respond_to do |format|
        format.json do
          json = Jsonify::Builder.new
          json.errors errors
          a = json.compile!
          render :status => 400, :json => a
        end
      end
    else
      respond_to do |format|
        format.json do
          json = Jsonify::Builder.new
          json.msg "Update successful."
          a = json.compile!
          render :json => a
        end
      end
    end
  end

Здесь ключи похожи на

mythingie: location: date = value

mythingie: location: default = default

mythingie: location: date:z = "true"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...