Skip to content

Instantly share code, notes, and snippets.

@cutalion
Created June 7, 2012 15:06
Show Gist options
  • Save cutalion/2889295 to your computer and use it in GitHub Desktop.
Save cutalion/2889295 to your computer and use it in GitHub Desktop.
Rails Meetup - June 2012. Notes

Вопросы от Ивана Линько.

  1. Интересно было бы послушать чем отличается переезд с хероку от обычного деплоя на новый сервер, если чем-то отличается.
  • перенос БД (mongodump/mongorestore)
  • изменение способа хранения настроек
  • настройка почты (Google Apps)
  1. А так же какие может возникли интересные моменты или какие-нибудь хитрые штуки применял.
  • восстановление прав на домен
  • capistrano recipes
  1. Интересно, что выбрал в качестве рельсового сервера, ставил ли какие нибудь дополнительные плюшки.
  • unicorn + nginx
  1. Ну что-то в общем в таком ключе :)
  • $8.4/week on Heroku

Fast Tests

  1. BusinessLogic -> AR
# spec/models/dynamic_messages_spec.rb
#
# DynamicMessages.message("message-key").hide_from(user)
# DynamicMessages.message("message-key").hidden_from?(user)
#
require File.expand_path('../../app/models/dynamic_messages', File.dirname(__FILE__))

describe DynamicMessages do
  let(:user)    { stub :user }
  let(:message) { DynamicMessages.message("key") }
  let(:storage) { stub :storage }

  describe ".message" do
    subject { DynamicMessages.message("key") }
    it            { should be_a DynamicMessages::Message }
    its(:key)     { should == "key" }
    its(:storage) { should == DynamicMessages.storage }
  end


  describe "::Message" do
    before { message.stub storage: storage }
    describe "#hidden_from?" do
      it "asks storage about self" do
        storage.should_receive(:message_hidden_from?).with(message, user).and_return(true)
        message.should be_hidden_from(user)
      end
    end

    describe "hide_from" do
      let(:message) { DynamicMessages.message("key") }
      it "delegates hiding to storage" do
        storage.should_receive(:hide_message_from).with(message, user)
        message.hide_from(user)
      end
    end
  end
end


# spec/models/dynamic_message_spec.rb
#
# DB storage
require 'spec_helper'

describe DynamicMessage do
  describe ".message_hidden_from?" do
    let(:message) { stub :message, key: "key" }
    let(:viewer) { stub :viewer, id: 1, class: OpenStruct.new(name: "Viewer") }

    it "returns true if message with key, viewer_id and viewer_type exists and has hidden field set to true" do
      relation.stub exists?: true

      DynamicMessage.should_receive(:where).with(key: "key", viewer_id: 1, viewer_type: "Viewer").and_return(relation)
      DynamicMessage.message_hidden_from?(message, viewer).should == !relation.exists?
    end
  end
end

# config/initializers/dynamic_messaging.rb
DynamicMessages.storage = DynamicMessage

# app/models/dynamic_messages.rb
class DynamicMessages
  class << self
    attr_accessor :storage

    def message(key)
      return Message.new(key, storage)
    end
  end

  class Message
    attr_reader :key, :storage
    def initialize(key, storage)
      @key = key
      @storage = storage
    end

    def hidden_from?(somebody)
      storage.message_hidden_from?(self, somebody)
    end

    def hide_from(somebody)
      storage.hide_message_from(self, somebody)
    end
  end
end


# app/models/dynamic_message.rb
class DynamicMessage < ActiveRecord::Base
  def self.message_hidden_from?(message, viewer)
    where(key: message.key, viewer_id: viewer.id, viewer_type: viewer.class.name, hidden: true).exists?
  end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment