Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rails4 in Action

Rails4 in Action

I talked about Rails 4 from my experiment of development Triglav

For more details, see my blog post: http://blog.kentarok.org/entry/2012/11/22/005844

Kentaro Kuribayashi

November 21, 2012

More Decks by Kentaro Kuribayashi

Other Decks in Technology


  1. • Server management tool • Minimalistic features • Provides API

    to retrieve hosts, etc. • Copes with complicated demands with loose-coupled architecture • Written in Rails 4
  2. • Living on the Edge Rails is harder than you

    might imagine ;) • You’ll often get stuck into various problems around Rails eco-system
  3. The stories above are only applicable to Edge Rails, furthermore

    it is being to the major version up now! CAVEAT
  4. • As a result, I got to know more about

    Rails internal • I recommend you should be into it once at least :)
  5. Edge Guides http://edgeguides.rubyonrails.org/ Edge API Reference http://edgeapi.rubyonrails.org/ Rails4 Release Notes

    http://edgeguides.rubyonrails.org/4_0_release_notes.html Rails 4 compilation links http://blog.wyeworks.com/2012/11/13/rails-4-compilation-links/
  6. I’ll talk to you about the Rails4 changes from my

    point of view, that is, changes which I bumped into actually while developing Triglav with Edge Rails these days. It must be also applicable to any other common web apps.
  7. class ApplicationController add_flash_types :success, :error end <% if error %>

    <%= error %> <% elsif success %> <%= success %> <% end %> redirect_to ‘/foo’, error: 'message' add_flash_types view controller
  8. concern :commentable do resources :comments, only: [:create] end resources :services,

    constraints: { id: /[^\/]+/ }, concerns: [:commentable] resources :roles, constraints: { id: /[^\/]+/ }, concerns: [:commentable] resources :hosts, constraints: { id: /[^\/]+/ }, concerns: [:commentable] concern # instead of `root to: ‘main#index’` root ‘main#index’ root ...
  9. create_table :messages do |t| t.references :person end add_index :messages, :person_id

    index option create_table :messages do |t| t.references :person, index: true end We never neglect to add indices!
  10. create_join_table :products, :categories create join table create_table :categories_products, :id =>

    false do |td| td.integer :product_id, :null => false td.integer :category_id, :null => false end
  11. <%= content_tag_for(:tr, @posts) do |post| %> ... scaffold generator now

    use `content_tag_for` <% @posts.each do |post| %> <tr> ... `content_tag_for` automatically adds `id` attribute along with active record object. It’s very useful.
  12. Clunky JavaScript helpers will be removed • button_to_function • link_to_function

    It might cost you some long time than you’ll expect if you use them heavily
  13. find_all_by_* find_last_by_* scoped_by_* find_or_initialize_by_* find_or_create_by_* find_or_create_by_*! AR finder methods where(...)

    where(...).last where(...) where(...).first_or_initialize where(...).first_or_create where(...).first_or_create!
  14. active_record_deprecate_finders ... can be written as below for now, until

    Rails5: Post.scoped(:where => { :comments_count => 10 }, :limit => 5) Post.where(comments_count: 10).limit(5) “The code to implement the deprecated features has been moved out to the active_record_deprecated_finders gem. This gem is a dependency of Active Record in Rails 4.0. It will no longer be a dependency from Rails 4.1, but if your app relies on the deprecated features then you can add it to your own Gemfile. It will be maintained by the Rails core team until Rails 5.0 is released.” -- Rails4 Release Notes
  15. class Person < ActiveRecord::Base attr_accessible :name, :age end attr_accessible (Old

    Way) “Before Strong Parameters arrived, mass-assignment protection was a model's task provided by Active Model. This has been extracted to the ProtectedAttributes gem. In order to use attr_accessible and attr_protected helpers in your models, you should add protected_attributes to your Gemfile.” Ruby On Rails Security Guide http://edgeguides.rubyonrails.org/security.html
  16. class Person < ActiveRecord::Base include ActiveModel::ForbiddenAttributesProtection end class PeopleController <

    ActionController::Base def create Person.create(person_params) end private def person_params params.require(:person).permit(:name, :age) end end ActionController::Parameters
  17. class Person has_many :pets accepts_nested_attributes_for :pets end # PeopleController def

    person_params params.require(:person).permit( :name, :age, pets_attributes: [ :name, :category ] ) end accepts_nested_attribute_for Pass *_attributes as an Array
  18. # PeopleController def person_params params.require(:person).permit( :name, :age, pets_attributes: [ :name,

    :category :id, :_destroy ] ) end accepts_nested_attribute_for Both :id and :_destroy seem to be needed to update/delete nested models
  19. job = MyJob.new Rails.queue.push(job) class MyJob def run # do

    something end end Define job Enqueue it Job class must have only run method
  20. “The basic queue that comes with Rails is not a

    long-term solution. The goal here is to establish a common API that more robust queueing systems can plug themselves into. In most cases you shouldn't need to change any of your app code if you want to switch from Resque toSidekiq. You should take care that the objects you are enqueing can be properly marshalled.” http://reefpoints.dockyard.com/ruby/2012/06/25/rails-4-sneak-peek-queueing.html Rails 4.0 Sneak Peek: Queueing
  21. class MyController < ActionController::Base include ActionController::Live def index 100.times {

    response.stream.write "hello world\n" } response.stream.close end end Live streaming
  22. Works fine with “Server-Sent Events” “This specification defines an API

    for opening an HTTP connection for receiving push notifications from a server in the form of DOM events. The API is designed such that it can be extended to work with other push notification schemes such as Push SMS.” http://www.w3.org/TR/eventsource/ W3C: Server-Sent Events
  23. “I thought streaming was already introduced in Rails 3.2. How

    is this different? Yes, streaming templates were added to Rails 3.2. The main difference between Live Streaming and Streaming Templates is that with Streaming Template, the application developer could not choose what data was sent to the client and when. Live Streaming gives the application developer full control of what data is sent to the client and when.” http://tenderlovemaking.com/2012/07/30/is-it-live.html IS IT LIVE?
  24. See my chat example using SSE for detailed usage of

    Queue API and ActionController::Live https://github.com/kentaro/rails4-chat
  25. config.allow_concurrency = true config.preload_frameworks = true # Same as calling

    `config.threadsafe!`, # but it’ll be deprecated from Rails4 config.cache_classes = true config.eager_load = true Allow parallel requests # Gemfile gem ‘puma’ $ bundle exec puma
  26. RECAP • Living on the Edge Rails is fun and

    good lesson • Rails4 is really promising and exciting • Try Rails4 as soon as possible! • I’m wating for your commit to Triglav ;)