アクションボタンの追加は
config.action_links.add ....
で追加できますが、これにより追加されたボタンのHTML要素には、class 'action' 属性がプレゼントされます。
この 'action' クラス属性は、active_scaffold.js により次の副作用を持ちます。
- 入れ子のパネルへレンダリングされる
という事なので、部分的にAJAXでパーツを置き換えようと思っても、うまく行きません。そこで、テンプレートを書き換えるしかありません。以下は、_list_header.rhtml を書き換えて、フィルタを切り替える例です。
<% if active_scaffold_config.action_links.any? { |link| link.type == :table } -%>
<div class="actions">
<!-- ここに目的のチェックボックスを作成 -->
<a position="top" class="link">
<input type="checkbox" id="view_past" value="全表示" onclick="view_all_foo()"
<%= 'checked' if(session[:pcomp] == 1) -%> />全表示</a>
<!-- ここまで -->
<% new_params = params_for(:action => :table) %>
<% active_scaffold_config.action_links.each :table do |link| -%>
<% next if controller.respond_to? link.security_method and !controller.send(link.security_method) -%>
<%= render_action_link(link, new_params) -%>
<% end -%>
<%= loading_indicator_tag(:action => :table) %>
</div>
<% end %>
<h2><%= active_scaffold_config.list.user.label %></h2>
<!-- ここからは、フィルタを実行するリクエストを送信 -->
<script type='text/javascript'>
function view_all_foo() {
var elem = document.getElementById( 'view_past' );
if( elem.checked ) {
new Ajax.Updater( 'foos-content', '/foos/set_view_all?scaffold_id=foo&page=1', { asynchronous:true, evalScripts:true } );
} else {
new Ajax.Updater( 'foos-content', '/foos/set_view_new?scaffold_id=foo&page=1', { asynchronous:true, evalScripts:true } );
}
}
</script>
<!-- ここまで -->
これに対して foos_controller.rb では
class FoosController < ApplicationController
layout 'application'
before_filter :authorize
record_select :per_page => 7, :search_on => [:name], :full_text_search => true
active_scaffold :foo do |config|
...
end
def set_view_all
session[:pcomp] = 1
rewrite_list
end
def set_view_new
session[:pcomp] = 0
rewrite_list
end
def conditions_for_collection
if session[:pcomp] == 0
'complete_flag = 0'
end
end
protected
...
def rewrite_list
do_list
render :active_scaffold => 'foos', :partial => 'list'
end
end
としています。尚、フィルタの値は、クッキーによる session[:pcomp] に持たせています。
修正:
一部コードがおかしかったので修正しました。
0 件のコメント:
コメントを投稿