ラベル ActiveScaffold の投稿を表示しています。 すべての投稿を表示
ラベル ActiveScaffold の投稿を表示しています。 すべての投稿を表示

2013-07-05

ActiveScaffoldでセレクトボックスで特定の値を選択させる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
いろいろできちゃうActiveScaffoldのコネタです。

ActiveScaffoldでセレクトボックスを使うときに、デフォルト値として特定の値を選択させておく方法です。

以下は、hogeカラムをセレクトボックスにしていて、tomatoをデフォルトとして選んでおく方法です。

config.columns[:hoge].form_ui            = :select
config.columns[:hoge].options[:options]  = ["potato","tomato","egg"]
config.columns[:hoge].options[:selected] = "tomato"

ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ


2013-01-07

ActiveScaffoldがchromeで表示が崩れるときの対応

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveScaffoldの特定のバージョンだけだとは思うのですが、ある日突然chromeで見ると新規登録などのフォームがくずれるようになってしまいました。他のブラウザでは問題ありませんでした。

どうもchromeでのcssの解釈が変わったようです。

以下のようにcssを上書きするようにしてやれば直ります。他のブラウザでも問題なく表示されました。

もともとはfloatがleftになっています。これをnoneにすればOKです。


.active-scaffold li.form-element dd {
  float: none
}


ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。

2012-12-16

ActiveScaffoldでも楽観的ロックは使えるようです

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
railsで楽観的ロックを使うためにはテーブルにlock_versionというinteger型のカラムを追加してあげればOKなのです。

詳しくは、以下が参考になります。
http://rubyonrails.gachinko.org/2012/11/

ActiveScaffoldもlock_versionというカラムがあればきちんと楽観的ロックを利用してくれます。
1点だけ注意する点としては、更新するカラムを限定している場合時でもlock_versionを更新対象に含めてあげることを忘れてはいけないのです。


ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ

2012-10-01

ActiveScaffoldでpaper_trailの履歴情報を表示する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveRecordの履歴情報には、
paper_trail
がよさげと先日ご紹介させていただきました。
ActiveRecordの変更履歴を保存するにはpaper_trailがよさげ


そのpaper_trailで保存された履歴情報をActiveScaffoldで表示する方法です。

Blogモデルで履歴情報を残すようにして、Blogモデル用のActiveScaffoldで履歴情報をネストして表示できるようにする例です。

ActiveScaffoldでnestを利用するには、has_manyで関係が明示されていないとダメっぽいので
まずはBlogモデルの履歴表示用のBlogVersionというモデルを作ります。
以下のような感じです。

# -*- encoding: utf-8 -*-
class BlogVersion < Version
  def method_missing(action)
    unless self.reify.attributes.keys.index(action.to_s).nil?
      self.reify[action]
    else
      super
    end
  end
end

paper_trailにより作成されたVersionモデルを継承します。
そしてmethod_missing内でBlogモデルが持つattributeと同じものを利用できるようにします。
厳密にはidとcreated_atだけはVersionのものになってしまいます。

そしてBlogモデルで以下のようにします。

# -*- encoding: utf-8 -*-
class Blog < ActiveRecord::Base
  has_many   :blog_versions, :foreign_key => "item_id"
end

versionsテーブルでblogsのidを保持するのはitem_idになるのでforeign_keyに指定します。


コントローラー側です。
まずは、BlogVersion用のものです。

class BlogVersionController < ApplicationController
  active_scaffold :blog_versions do |config|
    config.label = "変更履歴"
    config.actions.exclude :create, :update, :delete, :search
    config.columns = [:entry,
                      :auther,
                      :updated_at]
  end
end

新規追加、変更、削除はできないようにしておきます。
そして表示するカラムは明示します。

Blog用のものは以下のような感じです。

# -*- encoding: utf-8 -*-
class BlogController < ApplicationController
  active_scaffold :blogs do |config|
    config.label = "ブログエントリ"
    config.columns = [:entry,
                      :auther,
                      :created_at,
                      :updated_at]
    config.nested.add_link(:blog_versions, :label => '変更履歴')
  end
end

ここのnestedでblog_versionsを指定することで各ブログエントリ毎の変更履歴を表示することができるようになります。



ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ

2012-09-21

ActiveScaffoldで新規作成画面にデフォルト値を表示する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActvieScaffoldで新規作成画面にデフォルト値を埋め込む方法です。

対象のコントローラーに以下のような感じのdo_newを作成すればOKです。

protected
def do_new
  super
  @record.end_date = 1.month.from_now
end

superは忘れてはだめです。
そして@recordに値を設定すればOKです。
上記の例ではend_dateに今日の1ヶ月をデフォルト値として埋め込んでいる例です。


ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ


2012-09-13

ActiveScaffoldを使っているときにログインユーザ情報をモデルに持ち込む方法

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ログインしているユーザ情報をモデルでも利用できるようにしたい場合です。

以下のような手段があるようです。
http://rails-bestpractices.com/posts/47-fetch-current-user-in-models

ActiveScaffoldを使っていれば、以下のようにcontrollerにcurrent_userメソッドを定義すれば、
modelでcurrent_userが使えるようになります。

以下のような感じです。
app/controllers/application_controller.rb
class ApplicationController < ActionController::Base

  protected
  def current_user
    User.find(session[:user_id])
  end
end

app/models/aaa.rb
class Aaa < ActiveRecord::Base
  def set_user_info
    self.user_name = current_user.name
  end
end

みたいな感じです。

以下が参考になります。
http://www.ibm.com/developerworks/jp/linux/library/l-activescaffold/
https://github.com/activescaffold/active_scaffold/wiki/Security

current_userがモデルで使えるようになる処理は

lib/active_scaffold/active_record_permissions.rb
に記載されています。
ざっくりとした仕組みとしては、以下のような感じのことが行われているようです。

#モデル相当のもの
class Moo
  class << self
    attr_accessor :test_func
  end
  
  def current_user
    Moo.test_func.call
  end
end

#コントローラ相当のもの
class Con
  attr_accessor :val
  
  def set_mod_func
    Moo.test_func = proc { p "========#{@val}" }
  end
end

c = Con.new
c.val = "111"

m = Moo.new
m.current_user
NoMethodError: undefined method `call' for nil:NilClass

c.set_mod_func
m.test
"========111"


ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ

2012-09-12

ActiveScaffoldでmodelのデータ内容に応じて変更できたり、できなかったりする方法

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveScaffoldでmodelのデータ内容によって変更の可否を決めたい場合などのケースです。

たとえばあるモデルの状態が特定の値になったら変更できなくする場合です。

モデルにauthorized_for_update?という関数を定義しtrueを返せば変更ができてfalseを返すと変更ができなくなります。
class Sample < ActiveRecord::Base
  def authorized_for_update?
    if self.status < 99
      true
    else
      false
    end
  end
end

画面上では、変更できないレコードの変更ボタンがグレーになり利用できなくなっています。

authorized_for_update?をauthorized_for_delete?にすると削除できたり、できなかったりになります。

以下が参考になります。
https://github.com/activescaffold/active_scaffold/wiki/Security

ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ



2012-09-11

ActiveScaffoldでsession情報によってメニューを出したり出さなかったり

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveScaffoldでsessionにuser情報などを入れておいてログインしたユーザによって利用できる機能を変えるといったことをやる方法です。


class SampleController < ApplicationController
  
  #filterを利用するのがポイントです
  before_filter :update_table_config

  active_scaffold :samples do |config|
    #ここの処理はだいぶ早い段階で処理されるようでsessionオブジェクトが生成されていません
    config.label = "Sample"
    ・・・
  end

  protected
  def update_table_config
    #ここでsessionを利用して変更ができます。
    #Uesrモデルをsession[:user]にセットする処理はApplicationControllerなどで行います
    #年齢によって変更できるカラムが異なる例です
    if session[:user].age >= 20
      active_scaffold_config.update.columns = [:hobby,:smoke,:sake]
    else
      active_scaffold_config.update.columns = [:hobby]
    end
  end

end


active_scaffoldブロックの中で記載している設定をfilterではactive_scaffold_configというのに記載すればsession情報によって画面内容を変更できます。
ただfilter内ではすべての設定項目を変更できるわけではなさそうです。
試した限りactionsとnestedは利用できませんでした。

以下が参考になります。
https://github.com/activescaffold/active_scaffold/wiki/Per-Request-Configuration


ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ

2012-06-13

railsで社内システムを作るときに知っていると便利そうなこと

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
私は小規模ですがrailsで社内システムをいくつか作っています。
そこでrailsで社内システムを作るときに便利かもしれない、このブログのエントリをまとめてみました。
少々古い情報もありますが・・・


・Oracle、SQL Serverへの接続
社内には既存システムとしてOracleやSQL Serverがあると思います。
新しくrailsで作成するシステムのメインのDBはmysqlでもよいと思うのですが、既存システムのデータ参照などをすることも多いと思います。
OracleやSQL Serverが動いているマシンは、結構ゴージャスだったりバックアップが行き届いていたりということも多いと思うので、いっそ新しく作るシステムのメインのDBも既存の環境に同居するのもよいかもしれません。

関連するエントリは以下のとおりです。
RailsでSQL Serverに接続する
railsでOracleに接続できるようにする
railsでoracle9に接続する


・csv,tsv,excel,pdfを出力する
社内の他のシステムとデータ連携したり、帳票を生成したりする機会が多いと思うので、これらのデータを生成する方法は知っておくと便利そうです。
ちなみにPDF出力には、ThinReportsがオススメです。

関連するエントリは以下のとおりです。
rubyでcsvを作る時にカラムをダブルクォートでくくったり、くくらなかったり
railsのrespond_toでcsv
rubyで装飾されたExcelファイルを作成する
rubyで帳票
rubyで帳票を作るのに便利そうなThinReportsがバージョンアップしていた
rubyでpdf出力したときのspec


・認証連携
社内にはActiveDirectoryなど、なにかしらアカウントとパスワードを保持しているものがあると思います。
シングルサインオンできれば、それにこしたことないですが、新しく作成するシステムで独自にパスワード管理はやらないで、認証はオマカセして新規システムは認可だけするようにしたいものです。
railsで直接連携するのもよいとは思うのですが、こういう認証の連携はapacheの方がこなれているような気がするので認証はapacheにまかせてその結果で認可するというのもよいと思います。


関連するエントリは以下のとおりです。
ActvieDirectoryでケルベロス認証して、その結果をrailsで使ってみる



・お手軽にデータメンテナンス画面作成
社内システムではデータのCRUD操作と検索がとても多いと思います。なのでScaffoldを多用するのもよいですが、せっかくなので強化されたScaffoldを使うとより便利だと思います。
私はActiveScaffoldをよく使っています。


関連するエントリは以下のとおりです。
ActiveScaffoldの小ネタのまとめ



・その他
以下のことも知っていると便利そうな気がします。


関連するエントリは以下のとおりです。
railsでconfirm画面を表示する

大量のデータをActiveRecordで処理するとき
rubyで和暦を使いたいとき
Windows環境で作成したShift-JISのタブ区切りファイルをUTF-8でlinux上のrubyで扱う

rubyとは関係ないですが、以下も便利そうな気がします。
mysqlで4月始まりの年度情報などを得るためのsql


お役にたれれば幸いです。



2012-04-23

active scaffoldのfield_searchを使うときhas_manyで関連している先のテーブルの複数のカラムを検索対象にする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveScaffoldでfield_searchを使うときのお話です。

以下のようなモデルがあるとします。

class Order < ActiveRecord::Base
  has_many :items
end

class Item < ActiveRecord::Base
  belongs_to :order
end

Orderに対してActiveScaffoldを設定して、検索する際にOrderの情報だけでなくItemのコードや名称も検索したい場合です。
field_searchでなく、通常のsearchならば

config.columns[:items].search_sql = "concat(items.code,' ',items.name)"
みたいな設定をしてitemsをsearch対象に入れてあげればOKです。

field_searchの場合で、itemsの一つのカラムだけであれば
同じように
config.columns[:items].search_sql = "items.code"
でできるのですが、items.codeとitems.nameの両方の検索用テキストボックスを表示したい場合は、以下のように
ダミーカラムを用意することと検索条件を上書きすることで、できるようになります。

ここではダミーカラム、item_codeとitem_nameを定義しています。このカラムはorders、itemsにも存在しないカラムです。
一部記述を省略しています。
class OrderController < ApplicationController
  active_scaffold :orders do |config|
    config.label = "オーダー管理"

    config.actions.exclude :search
    config.actions.add :field_search

    config.columns = [...
                      :item_code,
                      :item_name]
    ...
    config.columns[:item_code].label = "商品コード"
    config.columns[:item_code].search_sql = ""
    config.columns[:item_name].label = "商品名"
    config.columns[:item_name].search_sql = ""

    #ダミーカラムを表示しないようにします
    config.list.columns.exclude [:item_code,:item_name]
    config.show.columns.exclude [:item_code,:item_name]
    config.create.columns.exclude [:item_code,:item_name]
    config.update.columns.exclude [:item_code,:item_name]

    #ダミーカラムを検索で利用します。
    config.field_search.columns = [:item_code,:item_name]
    config.field_search.text_search = false

    config.nested.add_link(:items,:label => "商品")
  end

  #ダミーカラムitem_codeを利用した検索条件
  def self.condition_for_item_code_column(column, value, like_pattern)
    ["orders.id in (select distinct order_id from items where where code = ?))", value.strip]
  end

  #ダミーカラムitem_nameを利用した検索条件
  def self.condition_for_item_code_column(column, value, like_pattern)
    ["orders.id in (select distinct order_id from items where where name = ?))", value.strip]
  end

end

データ量が多いテーブルにActiveScaffoldを使う時、検索はfield_searchがよさげ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
データ量が多いテーブルにActiveScaffoldを使うときの場合です。

たとえば、以下のようなテーブルがあるとします。

table名:logs
カラム
id
ip_address
user
page

普通にActiveScaffoldを設定すると検索は、テキストボックス一つ表示され
ここに10.10.10.10とか入れた場合、以下のようなSQLが発行されます。
select id from logs where ip_address like '%10.10.10.10% or user like '%10.10.10.10% or page like '%10.10.10.10%

データ量が少ないときは、一つの条件で複数のカラムを探すので便利なのですが
データ量が多くなるとindexが効かないので遅くなっていきます。

そんなときは、通常の検索のsearchではなくて、field_searchを使うのがよさげです。
field_searchの場合は、各カラム毎に検索用のテキストボックスが表示され、それぞれ個別に条件を指定することになります。
デフォルトではsearchと同じような検索になってしまうのですが、設定で完全一致にできてindexを効かせることができるようになります。

以下は、field_searchの設定例です。
class LogController < ApplicationController
  active_scaffold :logs do |config|
    config.label = "ログ情報"

    config.actions.exclude :search
    config.actions.add :field_search

    config.columns = [:ip_address,
                      :user,
                      :page]
    config.columns[:ip_address].label = "IPアドレス"
    config.columns[:user].label       = "ユーザ"
    config.columns[:page].label       = "ページ"
    config.show.columns << [:created_at,:updated_at]

    config.field_search.columns = [:ip_address,:user,:page]
    #ここで完全一致検索に設定
    config.field_search.text_search = false
  end
end

2012-01-11

ActiveScaffoldの一覧画面で長いテキストの省略の長さを変える

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveScaffoldで一覧画面に長めのテキストカラムを表示するとある程度長いテキストは、


長いテキストをActiveScaffoldで表示しようとすると途中で切れてしまうことがあ...

のように最後が...となって省略されます。
デフォルトでは50文字(?)以上で省略されるようです。

この長さを変えるには、以下のようにします。
ここではlong_msgカラムの省略サイズを500文字にしています。

config.columns[:long_msg].options[:truncate] = 500
設定する値を0またはnilにした場合は、デフォルト50が適用されるようです。

2011-08-09

ActiveScaffoldで削除の時のメッセージをカスタマイズする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveScaffoldで削除の際に出る確認メッセージをカスタマイズする方法です。 単純にメッセージを変えるのであれば以下のような感じでよいです。
config.delete.link.confirm = "削除してもいいのかい?ホントにいいのかい?"
単純な変更ならば、上記でよいのですが どうせならば何を削除するのかを、ちゃんとメッセージしたい場合は、以下のような感じになります。 例えばusersテーブルの情報を削除する場合です。 削除メッセージに削除対象のnameカラムの内容を表示するようにします。
config.delete.link.confirm = nil
config.delete.link.dhtml_confirm = UserConfirm.new
上記で指定したUserConfirmを以下のように定義します。
class UserConfirm < DHTMLConfirm
  def onclick_handler(controller, link_id)
    code = ""
    if link_id =~ /delete-([0-9]+)-link/
      name = User.find($1).name
    end
    script = <<-END
if (confirm("「#{name}」を削除していいのかい?ホントにいいのかい?")) window.gFireModalLink();
END
  end 
end
このUserConfirmクラスを app/controller/users_controller.rb のコントローラーのクラスの上にでも書いておけばOKです。 (他の場所の方がよいかもしれないですが・・・)

2011-06-17

ActiveScaffoldでファイルアップロード

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveScaffoldで管理しているモデルにファイルアップロード機能をつけたいと思ったわけです。

なんとActiveScaffoldでは、ファイルアップロードを使えるようにするfile_columnプラグインを利用できるようにすれば
勝手にファイルアップロードの画面が現れるのです。
http://wiki.activescaffold.com/wiki/published/FileColumnBridge

というわけで、file_columnプラグインを使えるようにします。

インストールは以下で。
script/plugin install http://filecolumn.googlecode.com/svn/tags/file_column

でも、2.3.11では、
uninitialized constant FileColumn::ClassMethods::Inflector
というエラーがでて動きませんでした。

なので
vender/plugins/file_column/lib/file_column.rb
のエラー発生部分を以下のように修正しました。
def file_column(attr, options={})
  options = DEFAULT_OPTIONS.merge(options) if options
      
  my_options = FileColumn::init_options(options, 
#                                        Inflector.underscore(self.name).to_s,
                                        ActiveSupport::Inflector.underscore(self.name).to_s,
                                        attr.to_s)
      
  state_attr = "@#{attr}_state".to_sym
  state_method = "#{attr}_state".to_sym
これとは別に以下のサイトでも直し方が紹介されています。
http://d.hatena.ne.jp/aki-s-119/20081201/1228168584

さらにデフォルトだと、日本語ファイル名は使えないので、
vender/plugins/file_column/lib/file_column.rb
の一部をいじりました。
def self.sanitize_filename(filename)
  filename = File.basename(filename.gsub("\\", "/")) # work-around for IE
#  filename.gsub!(/[^a-zA-Z0-9\.\-\+_]/,"_")
  filename.gsub!(/[^\w\.\-\+_]/,"_")
  filename = "_#{filename}" if filename =~ /^\.+$/
  filename = "unnamed" if filename.size == 0
  filename
end
以下のサイトを参考にさせていただきました。
http://www.kestrel.jp/modules/tinyd04/content/index.php?id=4

で後は、file_columnを使うことをモデルに記載してやればOKです。
以下の例では、foosテーブルのfilenameカラムにアップロードしたファイルの情報を格納して
実際にはpublic/uploadディレクトリの下にアップロードしたファイルが格納されます。
class Foo < ActiveRecord::Base
  file_column :filename, :web_root => "upload/",
                         :root_path => File.join(RAILS_ROOT, "public", "upload")
end

他にfile_columnに関しての情報は、以下が参考になります。
http://gdgdlog.net/log/show/227

後は、Fooモデル用のActiveScaffoldの画面を用意すれば、勝手にfilenameカラムがファイルアップロードのものになります。

私の環境では一度アップロードしたファイルを別のファイルに更新しようとするには一度、削除してからアップロードしないとダメでしたが、楽チンさを考えたらそれぐらいはよしです。

ActiveScaffoldステキです。


2011/6/24 追記
Railsアプリが
http://www.xxx.jp/
のような感じであれば上記だけで問題ないのですが、
専用のディレクトリの下で以下のような感じでやりたいとき、もうちょっとやることがあります。
http://www.xxx.jp/aaa/
アップロードはできるけど、ダウンロードがaaaを配慮してくれないのでできない情況です。

なのでActiveScaffoldとfile_columnそれぞれにちょっと手をいれます。

まずはActiveScaffoldは以下のファイルを以下のように変更します。
vendor/plugins/active_scaffold/lib/bridges/file_column/lib/list_ui.rb
       def active_scaffold_column_download_link(column, record, label = 
nil)
         return nil if record.send(column.name).nil?
         label||=as_(:download)
-        link_to( label, url_for_file_column(record, column.name.to_s), :popup => true)
+        link_to( label, url_for_file_column(record, column.name.to_s, {:absolute => true}), :popup => true)
       end

       def active_scaffold_column_thumbnail(column, record)

file_columnは以下のファイルを以下のように変更します。
vendor/plugins/file_column/lib/file_column_helper.rb
     return nil unless relative_path

     url = ""
-    url << request.relative_url_root.to_s if absolute
+    url << ActionController::Base.relative_url_root.to_s if absolute
     url << "/"
     url << object.send("#{method}_options")[:base_url] << "/"
     url << relative_path


2012/3/12 追記
Rails3.0では、ActionController::Base.relative_url_rootが使えなくなっているのでfile_columnは以下のように変更します。
vendor/plugins/file_column/lib/file_column_helper.rb
    url = ""
-   url << request.relative_url_root.to_s if absolute
-   url << "/"
+   url << root_url
    url << object.send("#{method}_options")[:base_url] << "/"
    url << relative_path


2011-06-15

ActiveScaffoldでThe {{key}} interpolation syntax in I18n messages is deprecated. Please use %{key} instead ってエラーが出た時は

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveScaffoldを使っていてログを見ていたら
The {{key}} interpolation syntax in I18n messages is deprecated. Please use %{key} instead
というエラーが表示されていました。

ちなみに利用しているRailsのバージョンは、2.3.11です。
別に問題なく利用できているのだけど、なんか気持ち悪いのです。

とりあえずエラーを消すならば
vendor/plugins/active_scaffold/lib/active_scaffold/locale/ja.yml
に書かれている
{{}}
をエラーメッセージどおりに
%{key}
に変えてやればOKでした。

2011-06-14

ActiveScaffoldで削除するときに独自エラーメッセージを出す

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveScaffoldで削除をするときに
before_destroyで削除前にチェックをして条件を満たさないと削除できないようにしようと思ったわけです。
削除自体はできなくなるのですが、エラーメッセージが出なかったり、出たとしても
削除できませんでした。
な感じのそっけないメッセージになります。

できれば削除できない理由をちゃんとメッセージしたいなぁと思ったわけです。
まずエラーメッセージを出すようにするには
before_destroyの中で例外を発生させる必要があります。

でエラーメッセージですが、
do_destroyという関数を書けばよいようです。
以下のような感じです。
def do_destroy 
  destroy_find_record 
  begin 
    self.successful = @record.destroy 
  rescue Exception => ex 
    flash[:warning] = "オリジナルメッセージ"
    self.successful = false 
  end 
end

以下が参考になりました。
http://groups.google.com/group/activescaffold/browse_thread/thread/3af21f82c1695a57?pli=1

2011-05-10

ActiveScaffoldの小ネタのまとめ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
RailsのScaffoldをステキにするActiveScaffoldの小ネタをちょこちょこ書いてきたので一回まとめてみます。

まずは本家は以下です。
http://activescaffold.com/

日本語でActiveScaffoldの使い方を知るのにオススメは以下です。
http://wota.jp/ac/?date=20071110#p01

以下は、今まで書いてきた小ネタです。
データを保存する際にsessionに格納されている情報を利用する

ActiveScaffoldとjQueryのthickboxを組み合わせる

Nestedを使ったらエラーが出たよ

日付入力でカレンダーを利用する方法

belogns_toのモデルの内容でソートする

セレクトボックスのソート順を変える

ActiveScaffoldでsum

独自のリンク

独自リンクをクリックしたときに確認をする

ActiveScaffoldで削除するときに独自エラーメッセージを出す

ActiveScaffoldでThe {{key}} interpolation syntax in I18n messages is deprecated. Please use %{key} instead ってエラーが出た時は

ActiveScaffoldでファイルアップロード

ActiveScaffoldで削除の時のメッセージをカスタマイズする

ActiveScaffoldの一覧画面で長いテキストの省略の長さを変える

データ量が多いテーブルにActiveScaffoldを使う時、検索はfield_searchがよさげ

active scaffoldのfield_searchを使うときhas_manyで関連している先のテーブルの複数のカラムを検索対象にする

ActiveScaffoldでsession情報によってメニューを出したり出さなかったり

ActiveScaffoldで新規作成画面にデフォルト値を表示する

ActiveScaffoldでpaper_trailの履歴情報を表示する

ActiveScaffoldでも楽観的ロックは使えるようです

ActiveScaffoldがchromeで表示が崩れるときの対応

ActiveScaffoldでセレクトボックスで特定の値を選択させる


また小ネタが増えたら追加しようと思います。

2011-04-14

ActiveScaffoldで独自リンクをクリックしたときに確認をする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActvieScaffoldのお話です。

独自リンクを作るときは、action_linksを使うわけですが、
その独自リンクをクリックしたときに
「本当にいいですか?」
的な確認を表示させる方法です。

以下のような感じです。
config.action_links.add 'ohoho', :label => 'おほほ', :page => true,
:type => :table, :confirm => '本当にいいですか?'

このようにすると
おほほ
というリンクが作成されて、クリックすると
「本当にいいですか?」
と確認が表示されます。
それでohohoアクションが実行されます。

ActiveScaffoldやっぱりステキです。

2011-03-07

ActiveScaffoldで独自のリンク

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
RailsのScaffoldをステキにするActiveScaffoldでは、データの追加、変更、削除の他に独自のリンクを作成できます。

リンクを追加するには、action_linksをいろいろいじります。

こんな感じでリンクを追加します。
config.action_links.add 'info', :label => '特別情報表示'
これでコントローラのinfoアクションが呼ばれることになります。
表示場所は、検索や新規追加などと同じ場所に埋め込まれる形で表示されます。

ページの頭ではなく、各レコード毎に表示したい場合は、
config.action_links.add 'info', :label => '特別情報表示', :type => :record
のように
:type => :record
を指定します。

ActiveScaffoldに埋め込まれる形でなく、新規にページを遷移させたい場合は、
config.action_links.add 'info', :label => '特別情報表示', :page => true
のように
:page => true
を指定します。

リンク先をActiveScaffoldを使っているコントローラとは別のコントローラのアクションにしたい場合は、
config.action_links.add 'info', :label => '特別情報表示', :page => true, :controller => 'info', :action => 'index'
のように
:controller => 'info',:action => 'index'
を指定します。

いろいろ便利なActiveScaffoldなのでした。

2011-02-25

ActiveScaffoldでsum

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
RailsのScaffoldをステキにするActiveScaffoldで特定のカラムの合計値を表示したいなぁと思ったわけです。

以下のようなテーブルがあるとします。
users
id
name

orders
id
user_id
amount

このようなテーブルがあっとしてuser毎のorderのamount合計を表示したいと思ったわけです。

とりあえず二つ方法がある感じです。

(1)userコントローラからorderコントローラをネスト表示してorderコントローラのリストに合計値を表示。
以下のような感じでコントローラーを準備します。
class UsersController < ApplicationController
  active_scaffold :users do |config|
    config.nested.add_link("オーダー", [:orders])
  end
end

class OrdersController < ApplicationController
  active_scaffold :orders do |config|
    config.columns[:amount].calculate = :sum
  end
end
これでhttp://budanters.blogspot.com/2009/10/adding-multiple-column-calculations-to.htmlにあるような感じでリストの下に合計値が表示されます。
合計値意外に、calculateが対応しているものとして:avgがあるようです。

この方法で表示すると合計値がSumと表示されるので、これを日本語にするには
vendor/plugins/active_scaffold/frontends/default/views/_list_calculations.html.erb
を対象のviewにコピーしていじってやればOKです。
この場合だと
app/view/order
の下にコピーとなります。

これでもよいっちゃぁよいのですが、できるならばuserコントローラに表示したいです。
というわけで、もう一つの方法です。
(2)モデルに合計値を定義しておいて表示する
まずはuserモデルに合計値を定義します。
class User < ActiveRecord::Base
  has_many :orders

  def order_total
    self.orders.sum(:amount)
  end
end
で、以下のようにuserコントローラを準備します。
class UsersController < ApplicationController
  active_scaffold :users do |config|
    config.list.columns << :order_total
  end
end

これでuserのリストのユーザ毎の合計値が表示されます。

なかなか便利なActiveScaffoldです。