最近のトラックバック

Twitter

楽天

ruby/rails

acts_as_paranoid

rails上でレコードを削除する際に、DBから物理的に削除してしまうのではなく、
削除フラグをつけて見えないようにするプラグイン。

○使い方
インストール

ruby script/plugin install acts_as_paranoid

DBの設定

deleted_atカラムをdatetimeで作成

モデルに記述

def class Test < ActiveRecord::Base
        acts_as_paranoid
end

以上で、「削除」したとき見た目は普通の削除と同じように削除されるけども、
DB上には"deleted_at"カラムに削除日時が記述されたままで残っている状態になる。

また、削除したものを取得・表示したい場合には下記の様に、オプションをfindするときに指定すればよい。

@test = Test.find(:all,:with_deleted => true)

一応、このプラグインはActiveScaffoldでも使える。

参考:http://ar-paranoid.rubyforge.org/

ActiveScaffoldで表示するレコードを設定する

一覧を表示する際に、ある特定のカラムがAであるものののみ、
もしくはAでないもののみ表示したいということがある。
たとえば、一覧上からは消したいけども、DBからは消したくないのでフラグ用のカラムをつけて、
falseのものは

表示しない

という場合。(今回がコレ)

このような場合,

ActiveScaffold

では、"conditions_for_collection"というメソッドを作ってやることで可能になる。

class TestController < ApplicationController
    active_scaffold :test

   def conditions_for_collection
        ['enable IN (?)', ['true']]
    end

end

上記の場合、"enable"というカラムが"true"のもののみが表示されるようになる。

ActiveCalendarの入力フォーマットを変える

ActiveScaffoldで日付や日時を入力するときに使用できるActiveCalendarだけど、
デフォルトの入力フォーマットが、

03/24/2008 11:00 AM

のように「月/日/年 時:分 午前・午後」のようになっていて、
日本で使うにはあまり使いやすくない。

それで、このフォーマットを変えるための方法。
元ネタはココ

ActiveScaffoldなので、Viewは直接いじらずに、
フォームをヘルパでオーバライドしてやる。

def begining_form_column(record,name)
    datetime_select(:record, :begining, :name=>name,
:ifFormat => "%Y-%m-%d %H" )
end

ポイントは赤字の部分で、オプションに":ifFormat"をつけ、フォーマットを記述してやる。
上記の場合は"2008-03-24 11:00"という表記になる。
フォーマットの詳細は以下

%y 年:世紀表示無し ( 00 .. 99 )
%Y 年:世紀表示有( ex. 1979 )
%b 月:省略形(英語表記)
%B 月:省略無し(英語表記)
%m 月:数字表記month ( 01 .. 12 )
%d 日:数値表記( 00 .. 31 )
%j  日:1/1から何日目か ( 000 .. 366 )
%a 曜日:省略形(英語表記)
%A 曜日:省略無し(英語表記)
%w 曜日:数値表記 ( 0 .. 6, 0 = 日曜日 )
%H 時:24時間表記(00 .. 23)
%I  時:12時間表記(01 .. 12)
%p 午前・午後表記:“PM” or “AM”
%M 分:00 .. 59
%S 秒:00 .. 59
%U, %W 周番号:1年の何週目か
%n 改行


ActiveScaffoldListFilters

やりたいことの中に、「Excelのオートフィルタのように各カラムごとに表示するデータをフィルタする」というのがある。
ActiveScaffoldで、これができそうなプラグインを見つけたのでメモしておく。

ActiveScaffoldListFilters
http://code.google.com/p/activescaffoldlistfilters/
http://groups.google.com/group/activescaffold/browse_thread/thread/7364d2f75aa77f7d/3b2263089e845638

Activescaffoldでdate/datetimeをカレンダーで入力する

activescaffoldを使うと、dateやdatetimeの入力は自動的にプルダウンでの入力になる。
しかし、プルダウンでは結構入力しにくい。

なのでカレンダーを表示させて、ここから日付や時刻を入力させたい。
ActiveScaffoldで使えるプラグインは以下のURLに載っていて、
その中でActiveCalendar と、CalendarDateSelectが使えそうなかんじ。

http://wiki.activescaffold.com/wiki/published/ThirdPartyPlugins

ActiveCalendarのほうが、使いやすそう&時刻も入力できるので、こちらを使う

まずインストール。

./script/plugin install http://activecalendar.googlecode.com/svn/trunk/activecalendar
次にlayoutに下記を追加
<%= stylesheet_link_tag "/javascripts/jscalendar-1.0/calendar-win2k-cold-1.css" %>
<%= javascript_include_tag "jscalendar-1.0/calendar.js" %>
<%= javascript_include_tag "jscalendar-1.0/lang/calendar-en.js" %>
<%= javascript_include_tag "jscalendar-1.0/calendar-setup.js" %>

これで終了。viewやhelper,controllerに手を入れる必要はなし。
これだけで、date_selectやdatetime_selectを上書きしてくれる。

インストールされたライブラリの中を見ると、calendar-ja.jsとかもあるので、
日本語にローカライズもlayoutでcalendar-ja.jsを指定すればできそうなのだが、
単にcalendar-en.jsを置き換えただけだと動かなかった。

active scaffoldのform_ui

ActiveScaffold 1.1からはui_typeに変わって、form_uiが使われている(ui_typeはform_uiへのエイリアス)。
form_uiで使えるオプションの例

  • :calendar

    • カレンダーで日付入力。calendarプラグインが必要
  • :checkbox

    • チェックボックス
  • :country

    • 国名。optionsに:priorityを設定できる
  • :password

    • パスワード入力用のテキストフィールド
  • :textarea

    • テキストボックス。optionsでサイズ(:cols,:rows)を指定できる
  • :usa_state

    • アメリカの州名リスト。optionsで:priorityを設定できる
  • :select

    • プルダウンの選択リスト。optionsで選択肢を設定できる
  • :crud
    • デフォルト

実際に使う場合の例

conf.colmuns[:test].options = { :cols => 100,:rows => 30 }
conf.columns[:test].form_ui = :textarea

作成日時、更新日時を自動登録する

テーブルにある特定のカラムを作成しておくと、作成日時、更新日時を自動登録してくれる

  • created_at => datetime
    • 作成日時
  • created_on => date
    • 作成日
  • updated_at => datetime
    • 更新日時
  • updated_on => date
    • 更新日

こんな感じで

railsのプラグインのあるサイトを探す

railsにはたくさんプラグインがあり、使う際には以下のようなコマンドを使う

ruby script/plugin install plugin_name

だけど、これではプラグインが見つからないといわれてインストールできないことがある。
そんなときは下記のコマンドでプラグインの配布元を検索・追加してやる

ruby script/plugin discover

URLの一覧が出てくるので追加するならエンターかYをしないならnを押す。

プルダウンを連動させる

よくあるフォームの中に、
県をプルダウンから選ぶと、その県の市町村が表示される、
というようなものがある。

これを、railsで再現する。

1.viewの編集

<%= select :record, :pref,["北海道","青森","岩手","山形"] %>
<%= select :record, :city,["県を選んでください"] %>
<%= observe_field(:record_pref,
    :update => :record_city,
    :on => 'change',
    :url => { :action => :live_search }) %>

 まず、県を選ぶプルダウンメニュー(id:record_pref)、市町村を選ぶプルダウンメニュー(id:record_city)を作成し、
 observe_fieldで、record_prefの選択を監視し、何らかの値が選択された時点でrecord_cityを書き換える。
 書き換えるためのメソッド(URL)を指定しておく

2.controllerを編集
 viewでrecord_prefを選択した際に、live_searchというメソッドで処理するように設定したので、live_searchというメソッドを追加する。

def live_search
    hokkaido=["札幌","旭川","函館","苫小牧"]
    aomori=["青森","八戸"]
    iwate=["盛岡"]
    yamagata=["山形"]

    query = request.raw_post

    case query
    when "北海道" then
        params[:city]=hokkaido
    when "青森" then
        params[:city]=aomori
    when "岩手" then
       params[:city]=iwate
    when "山形" then
       params[:city]=yamagata
    else
      params[:city]=["異常です"]
    end

    render :partial=>"city"
end

record_prefに対応する配列を作っておき、record_prefの内容によってparams[:city]の中身を切り替える。
最後に部分テンプレート「_city.rhtml」を使って結果を表示する

3._city.rhtmlの作成
 _city.rhtmlでparams[:city]をselectタグのoption valueに展開する

<%= options_for_select(params[:list]) %>

以上で、プルダウンを動的に変更できるようになる。
ただし、上記内容については未検証。(cotroller部分が微妙)

ActiveScoaffoldで、値を自動設定する。

railsでDBを操作するアプリを作るとき、ある特定のカラムは内部的に処理をして、
データを入力したいということがままある。

そんなときにActiveScaffoldではどうするかというと、
"before_create_save"というメソッドをコントローラに書くことで実現できる。

たとえば、カラムが"id","task","created_by"というテーブルがあるとき、
"created_by"には、ログインして登録を行っているユーザを自動的に登録したいというとき。この場合以下のようにコントローラに記述することで、自動登録が可能になる

class TaskController < ApplicationController
  active_scaffold :tasks

  protected

  def before_create_save(record)
    record.created_by = current_user
  end
end
同様に、"after_create_save"というメソッドも使える。

2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ