- 1.0.0
- 1.1.6
- 1.2.6
- 2.0.3
- 2.1.0
- 2.2.1
- 2.3.8
- 3.0.0
- 3.0.9
- 3.1.0
- 3.2.1
- 3.2.8
- 3.2.13
- 4.0.2
- 4.1.8 (0)
- 4.2.1 (0)
- 4.2.7 (-1)
- 4.2.9 (0)
- 5.0.0.1 (27)
- 5.1.7 (0)
- 5.2.3 (0)
- 6.0.0 (2)
- 6.1.3.1 (6)
- 6.1.7.7 (0)
- 7.0.0 (7)
- 7.1.3.2 (38)
- 7.1.3.4 (0)
- What's this?
Declare an enum attribute where the values map to integers in the database, but can be queried by name. Example:
class Conversation < ActiveRecord::Base enum :status, [ :active, :archived ] end # conversation.update! status: 0 conversation.active! conversation.active? # => true conversation.status # => "active" # conversation.update! status: 1 conversation.archived! conversation.archived? # => true conversation.status # => "archived" # conversation.status = 1 conversation.status = "archived" conversation.status = nil conversation.status.nil? # => true conversation.status # => nil
Scopes based on the allowed values of the enum field will be provided as well. With the above example:
Conversation.active Conversation.not_active Conversation.archived Conversation.not_archived
Of course, you can also query them directly if the scopes don’t fit your needs:
Conversation.where(status: [:active, :archived]) Conversation.where.not(status: :active)
Defining scopes can be disabled by setting :scopes to false.
class Conversation < ActiveRecord::Base enum :status, [ :active, :archived ], scopes: false end
You can set the default enum value by setting :default, like:
class Conversation < ActiveRecord::Base enum :status, [ :active, :archived ], default: :active end conversation = Conversation.new conversation.status # => "active"
It’s possible to explicitly map the relation between attribute and database integer with a hash:
class Conversation < ActiveRecord::Base enum :status, active: 0, archived: 1 end
Finally it’s also possible to use a string column to persist the enumerated value. Note that this will likely lead to slower database queries:
class Conversation < ActiveRecord::Base enum :status, active: "active", archived: "archived" end
Note that when an array is used, the implicit mapping from the values to database integers is derived from the order the values appear in the array. In the example, :active is mapped to 0 as it’s the first element, and :archived is mapped to 1. In general, the i-th element is mapped to i-1 in the database.
Therefore, once a value is added to the enum array, its position in the array must be maintained, and new values should only be added to the end of the array. To remove unused values, the explicit hash syntax should be used.
In rare circumstances you might need to access the mapping directly. The mappings are exposed through a class method with the pluralized attribute name, which return the mapping in a ActiveSupport::HashWithIndifferentAccess :
Conversation.statuses[:active] # => 0 Conversation.statuses["archived"] # => 1
Use that class method when you need to know the ordinal value of an enum. For example, you can use that when manually building SQL strings:
Conversation.where("status <> ?", Conversation.statuses[:archived])
You can use the :prefix or :suffix options when you need to define multiple enums with same values. If the passed value is true, the methods are prefixed/suffixed with the name of the enum. It is also possible to supply a custom value:
class Conversation < ActiveRecord::Base enum :status, [ :active, :archived ], suffix: true enum :comments_status, [ :active, :inactive ], prefix: :comments end
With the above example, the bang and predicate methods along with the associated scopes are now prefixed and/or suffixed accordingly:
conversation.active_status! conversation.archived_status? # => false conversation.comments_inactive! conversation.comments_active? # => false
If you want to disable the auto-generated methods on the model, you can do so by setting the :instance_methods option to false:
class Conversation < ActiveRecord::Base enum :status, [ :active, :archived ], instance_methods: false end
If you want the enum value to be validated before saving, use the option :validate:
class Conversation < ActiveRecord::Base enum :status, [ :active, :archived ], validate: true end conversation = Conversation.new conversation.status = :unknown conversation.valid? # => false conversation.status = nil conversation.valid? # => false conversation.status = :active conversation.valid? # => true
It is also possible to pass additional validation options:
class Conversation < ActiveRecord::Base enum :status, [ :active, :archived ], validate: { allow_nil: true } end conversation = Conversation.new conversation.status = :unknown conversation.valid? # => false conversation.status = nil conversation.valid? # => true conversation.status = :active conversation.valid? # => true
Otherwise ArgumentError will raise:
class Conversation < ActiveRecord::Base enum :status, [ :active, :archived ] end conversation = Conversation.new conversation.status = :unknown # 'unknown' is not a valid status (ArgumentError)
Constants
ENUM_CONFLICT_MESSAGE = \ "You tried to define an enum named \"%{enum}\" on the model \"%{klass}\", but " \ "this will generate a %{type} method \"%{method}\", which is already defined " \ "by %{source}."
Attributes
Integrate enum with PostgreSQL Enumerated Types
Extract from:
http://www.sitepoint.com/enumerated-types-with-activerecord-and-postgresql/
There are 2 things that we need to do before we can use ActiveRecord::Enum with PostgreSQL Enumerated Types: database migration and enum declaration.
First, let’s create the database migration:
$ bundle exec rails generate migration AddGenderToUsers gender:gender
Next, edit the generated migration to add the type:
# db/migrate/20150619131527_add_gender_to_users.rb class AddGenderToUsers < ActiveRecord::Migration def up execute <<-SQL CREATE TYPE gender AS ENUM ('male', 'female', 'not_sure', 'prefer_not_to_disclose'); SQL add_column :users, :gender, :gender, index: true end def down remove_column :users, :gender execute <<-SQL DROP TYPE gender; SQL end end
Once you’re finished with that, run the migration:
$ bundle exec rake db:migrate
Now, we have completed the database migration. The next step is to declare an enum in the User model. Earlier, we used both the Array and Hash forms to declare an enum. For the integration to work, we need to declare an enum using the Hash form:
# app/models/user.rb class User < ActiveRecord::Base enum gender: { male: 'male', female: 'female', not_sure: 'not_sure', prefer_not_to_disclose: 'prefer_not_to_disclose' } end
Finally, we can store ActiveRecord::Enum values using PostgreSQL Enumerated Types. As a bonus, all helper methods provided by ActiveRecord::Enum still work as expected.
Text values for enum
There is way to have text values for enum. It is useful to have localized select options and latin values in database. 1) User model: enum kind: { ‘текст’=>‘text’, ‘изображение’=>‘picture’, ‘звук’=>‘audio’, ‘видео’=>‘video’ } 2) Edit view: <%= select_tag ‘user[kind]’, options_for_select(User.kinds, @user.kind) %>
Search Kick Gem – To Make Your Search Intelligent On Rails App
Search kick Gem is a Ruby gem that runs on top of Elasticsearch and makes it easy to make searches in a Rails-friendly fashion. In addition, it allows you to add more features including analytics, autocomplete, and personalized results. Searchkick realizes what your users are searching for. As more individuals hunt, it gets more brilliant and the outcomes improve. It’s benevolent for designers – and supernatural for your users. It handles stemming, special characters, extra whitespace, misspellings, custom synonyms. To get started, make sure that you have Elasticsearch installed on your home computer. Depending on your operating system, the installation process is slightly different and make sure you have at least Java 7. Once you have that done, add and install searchick to your Rails application by adding the following to your Gemfile and running bundle install.
gem ‘searchkick’
When you have both installed and ready to go, you need to indicate which models you might want to be able to search through in your application. Just add searchkick to the model file to make it work. Then, we need to reindex the models so that Elasticsearch can run properly. In your terminal, run:
rake searchkick:reindex:all
Seeking with searchkick is entirely straightforward. Basically run YourModel.search, trailed by the parameters of the search and any filters that you want to add on. For instance, one of more complex searches is below:
@offers = Offer.search params[:search], page: params[:page], per_page: 10, order: {starttime: :desc}, fields: [{offer_name: :word_start}, { offer_request_name: :word_start}:price], where: { starttime: { gte: DateTime.strptime(params[:fromdate],‘%m/%d%Y’), lte: DateTime.strptime(params[:todate],‘%m/%d/%) } }
In this search, we take the search query of the user with params[:search], and look through of the lessons with the following conditions:
Read More From Here : http://www.railscarma.com/blog/technical-articles/search-kick-gem-to-make-your-search-intelligent-on-rails-app/
How To Generate a Swagger Docs For Rails API
Making API for a Rails application is simple for a Ruby on Rails developer. In any case, how different clients/customers will know whether the API is working fine or not without a customer side application. Is there any answer for this which I can report for API inside the Rails application, The answer is yes we have numerous instruments and methodologies however I would favor swagger UI.
In this article I am going to disclose how to make Rails API documentation using swagger UI.
Prerequisites:- I am going to use one sample posts application which serves API calls.
Gem:- To Integrate swagger UI for Rails API I am using a gem called swagger-docs. Add this gem to your Gemfile in your application and do bundle install.
Swagger initializer file:- After bundling the gem create an initializer in config/initializers(e.g. swagger.rb) and specify the following options:
#File config/initializers/swagger.rb Swagger::Docs::Config.register_apis({ "1.0" => { # the extension used for the API :api_extension_type => :json, # the output location where your .json files are written to :api_file_path => "public/apidocs", # the URL base path to your API :base_path => "http://localhost:3000", # if you want to delete all .json files at each generation :clean_directory => true, # add custom attributes to api-docs :attributes => { :info => { "title" => "Your application title", "description" => "Rails API documention with Swagger UI.", "termsOfServiceUrl" => "", "contact" => "" } } } })
Refer below url for the list of configarations
https://github.com/richhollis/swagger-docs#configuration-options
swagger_controller and swagger_API are helpers to provide swagger UI documentation.
module Api module V1 class PostsController < ApplicationController respond_to :json swagger_controller :posts, 'Post Controller' swagger_api :create do summary 'Creating posts' notes 'Should be used for creating posts' param :form, 'post[name]', :string, :required, 'name' param :form, 'post[publish]', :boolean, :required, 'publish' end swagger_api :index do summary 'Get all the posts' notes 'Should be used for fetching all posts' param :header, :Authoraization, :string, :required, 'Authoraization' response :unauthorized response :ok, "Success" end swagger_api :show do summary 'Get all the posts' notes 'Should be used for fetching a post' param :path, :id, :string, :id response :unauthorized response :ok, "Success" end swagger_api :destroy do summary 'Destroy the post' notes 'Should be used for destroying a post' param :path, :id, :string, :id response :unauthorized response :ok, "Success" end end end end
Read More From Here http://goo.gl/dMVHon
How to generate & add sitemap to your Rails Application
Generate Sitemap: Required Gem: Sitemap generator:- github.com/kjvarga/sitemap_generator
SitemapGenerator is the easiest way to generate Sitemaps in Ruby. Rails integration provides access to the Rails route helpers within our sitemap config file and automatically makes the rake tasks available to us. Or if we prefer to use another framework, we can! We can use the rake tasks provided or run our sitemap configs as plain ruby scripts.
Sitemaps XML format:
The Sitemap protocol format consists of XML tags. All data values in a Sitemap must be entity-escaped. The file itself must be UTF-8 encoded.
The Sitemap must: Begin with an opening <urlset> tag and end with a closing </urlset> tag. Specify the namespace (protocol standard) within the <urlset> tag. Include a <url> entry for each URL, as a parent XML tag. Include a <loc> child entry for each <url> parent tag.
All other tags are optional. Also, all URLs in a Sitemap must be from a single host, such as www.xyz.com or estore.xyz.com. For more details: http://www.sitemaps.org/protocol.html
How to add a sitemap to a Rails app:
1, View for your sitemap:
# app/views/mysitemap/index.xml.erb
2, At your Controller: Let it be our object in view is @articles variable. It needs to get that from a mysitemap controller:
# app/controllers /mysitemap_controller.rb MysitemapController < ApplicationController layout nil def index headers['Content-Type'] = 'application/xml' respond_to do |format| format.xml {@articles = Article.all} end end end
3, Add a route:
# config/routes.rb get 'sitemap.xml', :to => 'sitemap#index', :defaults => {:format => 'xml'}
How to convert XML file to HTML: Read From Here http://goo.gl/Vp3chb
Usage of SQL and NoSQL Databases in single rails application(MySQL, PostgreSQL and MongoDB)
There are distinctive reasons why you should think about having various databases in your Ruby on Rails application. In my situation, I expected to store large quantities of data.
Consider default database is MySQL. In our application database.yml file write connections for MySQL in normal way. After that, for connecting postgresql in the same application we need to create custom files.
Create the custom database files to connect postgresql
We’re going to set up a second database called “Stats”
First of all, create the file config/database_stats.yml and populate it as you do with the primary database’s config file.
Your file will look something like this:
development: adapter: postgresql encoding: utf8 reconnect: false database: db_info_development pool: 5 host: localhost username: postgres password:
We’re now going to create a directory that will hold the schema and all the migrations of the Stats database.
Create directory with name db_stats in the rails root and copy the structure as mentioned below
–db –migrate schema.rb seeds.rb –db_stats –migrate schema.rb seeds.rb
The created files should be empty.
For handling stats database, we need to write custom tasks for creation, migrations and other functionalities.
Create a file lib/tasks/db_stats.rake with the below content
namespace :stats do namespace :db do |ns| task :drop do Rake::Task[“db:drop”].invoke end task :create do Rake::Task[“db:create”].invoke end task :setup do Rake::Task[“db:setup”].invoke end task :migrate do Rake::Task[“db:migrate”].invoke end task :rollback do Rake::Task[“db:rollback”].invoke end task :seed do Rake::Task[“db:seed”].invoke end task :version do Rake::Task[“db:version”].invoke end namespace :schema do task :load do Rake::Task[“db:schema:load”].invoke end task :dump do Rake::Task[“db:schema:dump”].invoke end end namespace :test do task :prepare do Rake::Task[“db:test:prepare”].invoke end end
# append and prepend proper tasks to all the tasks as defined above
ns.tasks.each do |task| task.enhance [“stats:set_custom_config”] do Rake::Task[“stats:revert_to_original_config”].invoke end end end task :set_custom_config do
# save current vars
@original_config = { env_schema: ENV[‘SCHEMA’], config: Rails.application.config.dup }
# set config variables for custom database
ENV[‘SCHEMA’] = “db_stats/schema.rb” Rails.application.config.paths[‘db’] = [“db_stats”] Rails.application.config.paths[‘db/migrate’] = [“db_stats/migrate”] Rails.application.config.paths[‘db/seeds’] = [“db_stats/seeds.rb”] Rails.application.config.paths[‘config/database’] = [“config/database_stats.yml”] end task :revert_to_original_config do # reset config variables to original values ENV[‘SCHEMA’] = @original_config[:env_schema] Rails.application.config = @original_config[:config] end end
Once all of this setup is done, we can create the stats database and run its first migration:
$ rake stats:db:create $ rake stats:db:migrate
This will generate the Stats database schema file in db_stats/schema.rb.
Add a custom migration generator We cannot use rails generator because the path hardcodes the db/migrate. Read more From Here http://goo.gl/jVCVRJ
Previewing Emails in Rails Applications With the Mail_View Gem
Sending an email from an application through a development or staging environment can be cumbersome especially when you want to preview the mail before you hit the send button. With the gem ‘mail_view, you can easily preview emails right from your development environment. Previewing mail is important to ensure that you are sending the right email and to the right person.
Never send a mail in dark anymore with the ‘mail_view gem! Check out more below on how it can be implemented in your application during the development stage.
Rails Email Preview helps us to quickly view the email in web browser in development mode.
-
Add “gem ‘rails_email_preview’, ‘~> 0.2.29’ “ to gem file and bundle install.
-
Run “rails g rails_email_preview:install” this creates initializer in config folder and add routes.
-
Run “rails g rails_email_preview:update_previews” this crates mailer_previews folder in app directory.
Generator will add a stub to each of your emails, then u populate the stub with mock data.
Ex:
class UserMailerPreview def invitation UserMailer.invitation mock_user(‘Alice’), mock_user(‘Bob’) end def welcome UserMailer.welcome mock_user end private def mock_user(name = ‘Bill Gates’) fake_id User.new(name: name, email: “user#{rand 100}@test.com”) end def fake_id(obj) obj.define_singleton_method(:id) { 123 + rand(100) } obj end end
-
Parameters in search query will be available as an instance variable to preview class.
Ex: if we have a URL like “/emails/user_mailer_preview-welcome?user_id=1” @user_id is defined in welcome method of UserMailerPreview it helps us to send mail to specific user.
class UserMailerPreview def welcome user = @user_id ? User.find(@user_id) : mock_user UserMailer.welcome(user) end end
-
To access REP url’s like this
rails_email_preview.rep_root_url rails_email_preview.rep_emails_url rails_email_preview.rep_email_url(‘user_mailer-welcome’)
-
We can send emails via REP, this will use environment mailer settings. Uncomment this line in the initializer to disable sending mail in test environment.
config.enable_send_email = false
References :
-
github.com/glebm/rails_email_preview
-
richonrails.com/articles/action-mailer-previews-in-ruby-on-rails-4-1
Read More From Here>>> http://goo.gl/KQBk5S