pg_search 和 rails 中的本地化

pg_search and localization in rails

我正在使用 pg_search,但在本地化方面遇到了一些问题。 我有 shop_item 个具有 title1、title2、description1、description2 属性的模型。取决于我使用的语言组合 title1 + description1 或 title2 + description2 在应用程序控制器中,我有一个设置语言环境的方法:

class ApplicationController < ActionController::Base
        before_action :set_locale
    private

        def set_locale
            I18n.locale = params[:locale] || I18n.default_locale
        end
end

商店商品控制器:

def index
    if params[:search].present?
      @shop_items = ShopItem.search_for_items(params[:search]).paginate(:page => params[:page], :per_page => 32).order('created_at DESC')
    else
      @shop_items = ShopItem.all.paginate(:page => params[:page], :per_page => 32).order('created_at DESC')
    end
  end

在我的 shop_items/index.html.erb 我有:

          <%= form_tag shop_items_path, :method => 'get'  do %>
          <%= text_field_tag :search, params[:search], autofocus: true,  type: "text", placeholder: 'search for messages'%>
          <%= submit_tag "search", type: "submit"%>
          <% end %>  

</br>
<% if current_page?(locale: :ua)%>
  <div class="row">    
    <% @shop_items.each do |si| %>

        <div class="col m3 ">
          <div class="card hoverable">
            <div class="card-image">
              <%= image_tag si.shop_image.url(:large) %>        
            </div>
            <div class="card-content"-->
              <span class="card-title truncate"><td><%= si.title1 %></td></span>
              <p><%= t(:price)%>: <%= si.price%></p>
            </div>
            <div class="card-action">
              <%= link_to t(:details), shop_item_path(si) %>
              <%= link_to t(:edit), edit_shop_item_path(si) if current_user.present? and current_user.admin? %>
              <%= link_to t(:destroy), si, method: :delete, data: { confirm: 'Are you sure?' } if current_user.present? and current_user.admin? %>
            </div>
          </div>
        </div>
    <% end %>
  </div>
<% end %>

如果我要进入 shop_items_path,我会在浏览器中看到下一个默认 url:

http://localhost:3000/shop_items?locale=ua

我可以看到我所有的 shop_item,但是如果我要从 url 中删除语言环境,例如:

  http://localhost:3000/shop_items

所有物品都消失了 当我使用搜索时,我有 url 比如:

http://localhost:3000/shop_items?utf8=%E2%9C%93&search=item&commit=search

如您所见,区域设置丢失,结果我在搜索后可以看到任何 shop_items。

我的问题是如何存储当前语言环境并将其包含在搜索查询中?

感谢任何解决方案!

更新: Rails.application.routes.draw 做 根:到=> 'shop_items#index' 资源:shopping_contacts 资源:cart_items

resources :shopping_carts do
    #resources :contact_infos
    resources :shopping_contacts
    resources :cart_items
    resources :cart_confirms
end
resources :shop_items do
    resources :cart_items
end

resources :contact_us
resources :contacts, only: [:new, :create, :edit, :update, :index, :destroy]  

get 'password_resets/new'

get 'password_resets/edit'

get 'sessions/new'
get    '/login',   to: 'sessions#new'
post   '/login',   to: 'sessions#create'
delete '/logout',  to: 'sessions#destroy'
resources :account_activations, only: [:edit]
resources :password_resets,     only: [:new, :create, :edit, :update]


get  '/signup',  to: 'users#new'
post '/signup',  to: 'users#create'  
resources :users

resources :main_shots

结束

好的,考虑更新,也许您应该按照以下步骤操作。

第一个将你的路线嵌套在 'scope '(:locale)', locale: /en|es/ do:' 这样。

Rails.application.routes.draw do 
 scope '(:locale)', locale: /en|es/ do


  root :to => 'shop_items#index' 
  resources :shopping_contacts 
  resources :cart_items

  resources :shopping_carts do
    #resources :contact_infos
    resources :shopping_contacts
    resources :cart_items
    resources :cart_confirms
  end

  resources :shop_items do
    resources :cart_items
  end

  resources :contact_us
  resources :contacts, only: [:new, :create, :edit, :update, :index, :destroy]  

  get 'password_resets/new'

  get 'password_resets/edit'

  get 'sessions/new'
  get    '/login',   to: 'sessions#new'
  post   '/login',   to: 'sessions#create'
  delete '/logout',  to: 'sessions#destroy'
  resources :account_activations, only: [:edit]
  resources :password_resets,     only: [:new, :create, :edit, :update]


  get  '/signup',  to: 'users#new'
  post '/signup',  to: 'users#create'  
  resources :users

  resources :main_shots
 end
end

第二步像application_controller.rb中那样添加这个方法:

  before_action :set_locale

  def set_locale
    I18n.locale = params.fetch(:locale, I18n.default_locale).to_sym
  end

  def default_url_options
    { locale: I18n.locale == I18n.default_locale ? nil : I18n.locale }
  end

最后一步你在 application.rb 中设置了 defautl 本地吗?:

config.i18n.default_locale = :en

给我你的反馈,祝你好运。