ユーザー設定項目を追加してみる。
最初にページを読み込んだ時の、リスト表示の並べ替え方法も、好みで設定できるようにしてみた。追記したのは以下の通り。
並べ替え方法の設定ページ追加
- 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に変換して保存する仕組みを作ってしまえば、データベースの修正は必要ないので、その点は手軽に追加できる。しかし今後、どちらの方法でユーザー設定を保存するべきか、迷う...。