ユーザー設定項目を追加してみる。

最初にページを読み込んだ時の、リスト表示の並べ替え方法も、好みで設定できるようにしてみた。追記したのは以下の通り。

並べ替え方法の設定ページ追加

app/views/defaults/_form.rhtml
ビュー(ユーザー環境設定のページ)
<%= error_messages_for 'default' %>

<table>
<tr>
  <th align="right">
  <label for="per_page">
    1ページ当りの表示件数:</label>
  </th>
  <td <%= field_with_errors_class(@default, '1ページ当りの表示件数:') %>>
  <%= text_field_tag 'per_page', @default_hash['per_page'], :name => "default[per_page]" %>
  </td>
</tr>

<%# ------並べ替え方法を設定するため、以下を追記------ %>
<tr>
  <th align="right"><label for="sort_field">並べ替えキー列と順序:</label></th>
  <td>
  <% options = @column_titles.map{|name| [Csv.human_attribute_name(name), name]} %>
  <% selected_item = @default_hash['sort_field'] %>
  <%= select_tag 'sort_field', options_for_select(options, selected_item), 
                 :name => "default[sort_field]" %>
  
  <%= radio_button_tag 'sort_direction', 'asc', @default_hash['sort_direction']=='asc', 
                       :name => "default[sort_direction]" %><small>昇順</small>
  <%= radio_button_tag 'sort_direction', 'desc', @default_hash['sort_direction']=='desc', 
                       :name => "default[sort_direction]" %><small>降順</small>
  </td>
</tr>
</table>
app/controllers/defaults_controller.rb
コントローラー
  • オレンジ色の部分の追記
class DefaultsController < ApplicationController
  ajax_scaffold :default
  
  def edit_preference
    @column_titles = Csv.show_column_names
    @default = current_user.default
    @default_hash = default_user(true)
  end
  
  def set_app_default
    @column_titles = Csv.show_column_names
    @default = current_user.default
    @default_hash = default_app
    render :action => 'edit_preference'
  end
  
  def update_preference
    current_user.create_default(:yaml => {}.to_yaml) if current_user.default.nil?
    @column_titles = Csv.show_column_names
    @default = current_user.default
    @default_hash = default_user.merge(params[:default])
    # アプリケーションデフォルトと同じ項目は削除したいが、削除してしまうとvalidateが正常に機能しない。
    # @default_hash.delete_if {|key, value| default_app[key] == value}
    
    if current_user.default.update_attributes(:yaml => @default_hash.to_yaml)
      flash[:notice] = 'ユーザー環境を更新しました。'
      redirect_to :controller => 'csvs', :action => 'list'
    else
      render :action => 'edit_preference'
      # 強制リロードを有効にして、キャンセルした時にキャッシュに残らないようにする。
      @default_hash = default_user(true)
    end
  end
end
app/controllers/application.rb
コントローラー
  • 並べ替え方法のアプリケーションデフォルトを設定した。(オレンジ色の部分)
require 'login_engine'
class ApplicationController < ActionController::Base
...(途中省略)...
  def default_app
    {'per_page'=>'10', 'sort_field'=>'created_at', 'sort_direction'=>'desc'}
  end
end


以上で、並べ替え方法が保存できるようになった。

保存した並べ替え方法を利用

app/controllers/csvs_controller
コントローラー
  • set_paginateメソッドの:orderの設定の部分を以下のように書き換えた。(オレンジ色の部分)
class CsvsController < ApplicationController
...(途中省略)...
  def set_pagination
    # :conditionsの設定
    filter = params[:filter] || {"0"=>{:column=>@column_titles[0], :item=>"", :id=>20}}
    sqls = []
    filter.each {|c, f| sqls << Filtersql.human_compair_sql(f[:column], f[:item], f[:id])}
    @conditions = sqls.join(params[:filter_and_or_op])
    
    # :orderの設定
    params[:sort_field] ||= default_user['sort_field']
    params[:sort_field] = default_user['sort_field'] if params[:sort_field].empty?
    params[:sort_direction] ||= default_user['sort_direction']
    params[:sort_direction] = (params[:sort_direction] == 'desc') ? 'desc' : 'asc'
    @next_direction = (params[:sort_direction] == 'asc') ? 'desc' : 'asc'
    @order = "#{params[:sort_field]} #{params[:sort_direction]}"
    
    # ハッシュのキーは、シンボルでなく、文字列で指定する必要あり。:per_page=>NG 'per_page'=>OK
    @csv_pages, @csvs = paginate :csvs, :per_page => default_user(true)['per_page'].to_i, 
                                 :conditions => @conditions, 
                                 :order => @order
  end
...(途中省略)...


これで、最初に表示した時の並べ替え方法も設定可能になった。

一度、yamlに変換して保存する仕組みを作ってしまえば、データベースの修正は必要ないので、その点は手軽に追加できる。しかし今後、どちらの方法でユーザー設定を保存するべきか、迷う...。