+1

Tìm hiểu về initializers

Trong một project Rails có một thư mục tên là initializers nằm trong thư mục config, thư mục này dùng để chứa các file .rb, ý nghĩa của thư mục này là khởi tạo tài nguyên. Mỗi khi chúng ta chạy server, Rails load các file và module xong thì sẽ chạy các file code .rb được đặt trong thư mục này.

Chúng ta sẽ quy định project sử dụng ngôn ngữ tiếng Anh mặc định khi chạy project.

Chúng ta tạo một file có tên i18n.rb trong thư mục initializers như sau:

config/initializers/i18n.rb
I18n.default_locale = :en
 
LANGUAGES = [
    ['English', 'en'],
    ['Tiếng Việt', 'vi']
]

Để thiết lập ngôn ngữ mặc định cho I18n thì chúng ta gán vào thuộc tính default_locale.

Ngoài ra ở đây chúng ta còn định nghĩa một mảng có tên là LANGUAGES chứa các phần tử là mảng khác, các mảng phần tử chứa tên các ngôn ngữ. Chúng ta tạo mảng này để tạo nút chọn ngôn ngữ cho người dùng sử dụng.

Bây giờ chúng ta sửa lại file layout như sau:

app/views/layout/application.html.erb

<!DOCTYPE html>
<html>
<head>
    <title>Books Store</title> 
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
    <%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track": true %>
    <%= javascript_include_tag "application", "data-turbolinks-track": true %>
    <%= csrf_meta_tags %>
</head>
<body id="store">
    <div id="banner"> 
        <%= form_tag '/', :class => "locale", :method => :get do %>
            <%= select_tag "set_locale",
                options_for_select(LANGUAGES, I18n.locale.to_s),
                :onchange => 'this.form.submit()' %>         
        <% end %>
        <%= image_tag("logo.png") %>
        <%= @page_title || t('.title') %>
    </div>
    <div id="columns">
        <div id="side">
            <div id="cart"> 
                <%= hide_cart_if(current_cart.line_items.empty?, :id => "cart") do %>
                    <%= render current_cart %> 
                <% end %>
            </div>
  
            <a href="#"><%= t(".home") %></a><br />
            <a href="#"><%= t(".faq") %></a><br />
            <a href="#"><%= t(".news") %></a><br />
            <a href="#"><%= t(".contact") %></a><br />
  
            <% if session[:user_id] %>
                <br/>
                <%= link_to "Orders", "/orders" %><br />
                <%= link_to "Products", "/products" %><br />
                <%= link_to "Users", "/users" %><br />
                <%= button_to "Logout", "/logout", :method => :delete %>
                <br/>
            <% else %>
                <br/>
                <%= link_to "Log In", login_path %><br />
            <% end %>
        </div>
        <div id="main">
            <%= yield %>
        </div>
    </div> 
</body>
</html>

Chúng ta tạo một form bằng phương thức form_tag, form này sẽ gửi về trang '/' với phương thức là GET, bên trong chúng ta tạo một nút combobox bằng phương thức select_tag, phương thức này sẽ tạo thẻ <select> trong HTML.

Tham số đầu tiên của phương thức này là 'set_locale', đây là tên tham số được truyền lên server, Tham số thứ 2 là phương thức options_for_select(LANGUAGES, I18n.locale.to_s), có nghĩa là lấy danh sách các phần tử cho trong biến LANGGUAGES (đã được định nghĩa ở trên) để làm các item, giá trị được select mặc định lấy trong từ I18n.locale.to_s. Tham số thứ 3 là :onchange, tức là tên phương thức được gọi khi người dùng chọn một item khác, ở đây phương thức đó là this.form.submit(), tức là sẽ gửi form về server.

Form này chúng ta định nghĩa class riêng là locale, bây giờ chúng ta định nghĩa class CSS đó như sau:

app/assets/stylesheets/depot.css
/* Language chooser style */
.locale {
    float: right;
    margin: -0.25em 0.1em;
}

Cuối cùng chúng ta sửa phương thức index trong lớp StoreController như sau:

app/controllers/store_controller.rb

class StoreController < ApplicationController
    skip_before_filter :authorize
     
    def index 
        if params[:set_locale]
            @redirectURL = '/' + params[:set_locale] 
            redirect_to @redirectURL
        else
            @products = Product.all
            @cart = current_cart
        end
    end
end

Chúng ta kiểm tra xem lệnh gửi lên có kèm theo tham số set_locale hay không, nếu có thì chúng ta redirect về lại trang này với tham số ngôn ngữ đi kèm.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí