1 vài thay đổi cho Rails 5.1 Beta Version 1

Bản beta 1 của Rails đã được public chính thức ngày 23/2/2017 với sự thay đổi chủ yếu là trong việc quản lý các file javascript. 3 highline chính của Rails 5.1 tập trung thay đổi:

  • Quản lý npm của JavaScript thông qua Yarn
  • Compline JavaScript với Webpack
  • Quay lại dùng Rails ajax mà không mặc định sử dụng jQuery nữa Ngoài ra, còn nhiều thay đổi khác nữa.

1. Thay đổi chính

1.1. Thay đổi về cấu trúc thư mục (Quản lý JavaScript thông bằng Yarn)

Rails 5.1 sinh ra file application.js trong forder packs trong asset/javascript không phải asset pipeline như rails 5

├── app │ └── javascript │ └── packs │ ├── app.vue │ ├── application.js │ └── hello_world.js ├── bin │ ├── webpack │ ├── webpack-dev-server │ ├── webpack-watcher │ └── yarn ├── config │ └── webpack │ ├── development.js │ ├── production.js │ └── shared.js ├── node_modules │ └── vue ├── package.json ├── public │ └── packs │ ├── application.js │ ├── application.js.map │ ├── hello_world.js │ └── hello_world.js.map └── yarn.lock

1.2 Biên dịch JavaScript bằng Webpack

Sử dụng gem webpacker, vẫn có thể sử dụng được asset pipeline cho : image, fonts,...Vừa có thể sử dụng asset pipeline và webpack để biên dịch các file này thông qua Yarn

1.3. Không mặc định sử dụng jquery ajax nữa Khi cần sử dụng jquery thì bạn cần rails new blog -j jquery

2. Một vài thay đổi khác

*Test:

  • Sử dụng gem Capybara trong quá trình test
  • Bỏ ActionDispatch::Callbacks.to_prepare và ActionDispatch::Callbacks.to_cleanup
  • Reset 1 session mới trong ActionDispatch::IntegrationTest#open_session

*Mã hóa bí mật

rails 5 rails 5.1
sử dụng RAILS_MASTER_KEY trong ENV Sinh ra mã hóa bí mât bằng bin/rails secrets:setup

*parameter mailer

  • sinh ra trước khi gọi các action. có thể định nghĩa mặc định phần header to/from/reply_to

*pack

  • custom url helper & polimorphic map url
    • Sử dụng "remove_method" thay vì "undefine_method" khi load routes
    • khai báo "resolve" song song với resource sử dụng cho polimorphic mapping model generates ra chính xác url từ form
   VD: 
         resource :user => "/user"
         resolve(class: "User") { [:user] } => "/user/:id"
  • Khai báo "direct" để tạo routing DSL thay vì custom url
    VD: 
         direct(:pack) { "https://github.com/rails/rails/pull/23138/files" }

  khi gọi pack_url
  => "https://github.com/rails/rails/pull/23138/files"
  • singular resource
routes 5.0 rails 5.0 rails 5.1 routes 5.1
profile POST /profile(.:format) profiles#create POST /profile(.:format) profiles#create profile
new_profile GET /profile/new(.:format) profiles#new GET /profile/new(.:format) profiles#new new_profile
** edit_profile ** GET /profile(.:format) profiles#show GET /profile(.:format) profiles#show **profile **
edit_profile GET /profile/edit(.:format) profiles#edit GET /profile/edit(.:format) profiles#edit edit_profile
edit_profile PATCH /profile(.:format) profiles#update PATCH /profile(.:format) profiles#update edit_profile
edit_profile PUT /profile(.:format) profiles#update PUT /profile(.:format) profiles#update edit_profile
edit_profile DELETE /profile(.:format) profiles#destroy DELETE /profile(.:format) profiles#destroy edit_profile
  • Thêm hash trong strong params
     params.permit(preferences: {})
  • sử dụng ActionController::Parameters#merge!, thay cho Hash#merge!

  • muốn sử dụng to_param thì phải có to_h

  • thêm content cho flash ngay trong redirect

redirect_to messages_url, notice: 'Message was created'
  • Hợp nhất form_for/form_tag với form_with
  • trả về đúng tên obj trong method form sau fields_for
    VD:
    >  <%= form_with scope: :post, url: super_special_posts_path %>

giống với

> <%= form_with model: @post do |form| %>
>      <%= form.text_field :title %>
> <% end %>
  • thêm form fields
> <%= fields :comment, model: @comment do |fields| %>
>       <%= fields.text_field :title %>
> <% end %>
> 
  • hiển thị chi tiết thông tin cache hit hoặc miss bằng cách config: config.action_controller.enable_fragment_cache_logging = true

  • syntax mới cho tag:

rails 5 rails 5.1
tag(:br, nil, true) tag(:div, content_tag(:p, "Hello world!"), class: "strong")
<%= tag :div, class: "strong" do %>Hello world!<% end %>tag.brtag.div tag.p("Hello world!"), class: "strong" <%= tag.div class: "strong" do %>Hello world!<% end %>
  • Đổi datetime_field và datetime_field_tag thành datetime-local
  • select_tag có thể blank VD: <option value="" label=" "></option>

*model

  • return true cho update_attribute khi giá trị của attribute được update là không đổi

All Rights Reserved