2010年11月22日

Rails on GAE

http://www.atmarkit.co.jp/fcoding/articles/gaephp/07/gaephp07a.html

参考に新規に作った(1テーブルscaffold)アプリをGAEに乗っけてみた。

一応動いたが、scaffoldできないっぽい?のですんなりできるとは言い難い。。。
posted by sistailsnow at 07:17| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2008年12月11日

sqlite3-ruby

windowsにて

sqlite-3_6_6_2.zip と dllを落としてパスを通す

>gem install sqlite3-ruby
Building native extensions. This could take a while...
ERROR: Error installing sqlite3-ruby:
ERROR: Failed to build gem native extension.

C:/Ruby/bin/ruby.exe extconf.rb install sqlite3-ruby
checking for fdatasync() in rt.lib... no
checking for sqlite3.h... no

nmake
'nmake' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。


インストール失敗

なもんで

http://rubyforge.org/frs/?group_id=254

から sqlite3-ruby-1.2.3-mswin32.gem を落として


>gem install sqlite3-ruby-1.2.3-mswin32.gem


無事インストール完了

ラベル:rails sqlite3
posted by sistailsnow at 17:22| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2008年12月08日

一括更新のために

Item
id : integer
name : string

というARモデルがあったとして

#チェックボックスで必要なItemだけ選択させる

View change.rhtml

<% form_tag do %>
<% @items.each do |item| %>
<%= check_box_tag 'items[]',item.id %>
 <%=h item.name >
<% end %>
<%= submit_tag '変更' %>
<% end %>


Controller

def change
if request.post?
 //Itemの選択
@items = Item.find(:all,:conditions => ['id in (?)',params[:items])

else
@items = Item.find(:all)
end
end



#nameを一気に変更

View change.rhtml

<% form_tag do %>
<% @items.each do |item| %>
 <%=text_field_tag("names[#{item.id}]",item.name) % >
<%= submit_tag '変更' %>
<% end %>
<% end %>


Controller

def change
@items = Item.find(:all)
if request.post?
 //Itemのnameを設定してく
@items.each do |item|
item.name = params[:names][item.id]
item.save!
end
end
end


posted by sistailsnow at 12:21| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2008年12月02日

ViewからControllerのメソッド

MVCの考えなぞ無視なトピックスですが。。。

rhtmlから

<% app = NewslettersController.new; %>
<%= app.hoge; %>


NewslettersController
def hoge
"hoge"
end


として文字列 "hoge"を出すことはできた。

が、sessionやらそのほかのものはやっぱり動かない。。。
ラベル:Rails
posted by sistailsnow at 16:47| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2008年11月28日

ActiveRecord where in

ActiveRecordのfindメソッドでsql のwhere inを吐かせるには、

ary = ["1","20","30"]
Model.find(:all,:conditions => ['id in (?)',ary])
ラベル:Rails
posted by sistailsnow at 17:47| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2008年11月20日

rails環境を呼び出す(drbで使う)

rails環境を持ったdrbサーバの作り方メモ
この場合は、各自処理を実行する@managerインスタンスを排他制御
以下rubyのスクリプト(RAILS_ROOTで実行する)


#!/usr/local/bin/ruby

#RAILS_ROOT/config/boot.rbを読み込む(環境に応じて適当に編集)
require File.dirname(__FILE__) + '/../config/boot'
require RAILS_ROOT + '/config/environment'

#サーバ処理オブジェクトの呼び出しWrapper
class WrapperBidsManager
#ActiveRecord環境の読み込み
@@config = YAML::load(File.open(File.dirname(__FILE__) + '/../config/database.yml'))
ActiveRecord::Base.establish_connection(
#@@config['production']
@@config['development']
)

def initialize
@manager = M.new
@m = Mutex.new
end

def check_and_bid

#if @m.locked?
# #TODO エラーはいて終了
# puts "locked"
#end

@m.synchronize do
#何か処理させる
@manager.doing
end
return true
end
end

class Daemon
def start(wrapper)
DRb.start_service("druby://localhost:9111", wrapper)
puts "listen on " + DRb.uri
end
end

#以下の#はforkが使える環境用

#fork{
# Process::setsid
# fork{
# STDIN.reopen("/dev/null", "r+")
# STDOUT.reopen("/dev/null", "w")
# STDERR.reopen("/dev/null", "w")
#
wrapper = WrapperBidsManager.new
daemon = Daemon.new
daemon.start(wrapper)
# DRb.thread.join
sleep
# }
#}



参考
http://rubyist.g.hatena.ne.jp/yamaz/20070217
ラベル:Rails drb
posted by sistailsnow at 11:52| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

ログにパスワードを表示させない

パスワードを log/*.log に表示させないためには、
ApplicationControllerでコメントアウトされている(2系?)
filter_parameter_logging を有効にしてください。

引数にはparamsで使われるkeyを指定すればいい。

password以外でもまずい情報はlogに残さないようにできる。


class ApplicationController < ActionController::Base

# See ActionController::Base for details
# Uncomment this to filter the contents of submitted sensitive data parameters
# from your application log (in this case, all fields with names like "password").

filter_parameter_logging :password


 
ラベル:Rails
posted by sistailsnow at 09:13| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2008年11月19日

attachment_fu

http://rubyforge.org/frs/?group_id=12&release_id=19196

RMagick-1.15.12-ImageMagick-6.3.7-8-Q8.zip ダウンロード

解凍ディレクト中の imagemagickインストール
>cd 解凍ディレクトリ
>gem update --system # RubyGems 0.9.5より前だったら
>gem install rmagick --local
ラベル:Rails
posted by sistailsnow at 18:05| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2008年11月07日

Rails 国際化対応

Ruby-GetTextで割と簡単に国際化対応

http://www.yotabanana.com/hiki/ja/ruby-gettext-howto-ror.html

基本的には上のサイトを参考に。

引っかかったのは、

>rake updatepo

を2回目以降にやるとき。


(Windowsでは) GNUのgettext(msgmerge が必要):rmsgmergeでもかまわないと書いてあるが動かない

GNU gettext
http://sourceforge.net/project/showfiles.php?group_id=23617&package_id=17255

からexeファイルをダウンロード

インストールして、そのbinディレクトリにPath通す。

Update(2回目以降)の様子
-xxx.pot ,xxx.po 両方上書きしてくれる(翻訳済みの poファイルはそのままで)
- _("xxx") で生成した項目がviewなどからなくなった場合は翻訳部分はコメントアウトされて残る。
ラベル:Rails gettext
posted by sistailsnow at 14:19| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2008年01月31日

Activation

Activation
メーラの用意
http://technoweenie.stikipad.com/plugins/show/Mailer+Setup
 アクティベーション
http://technoweenie.stikipad.com/plugins/show/User+Activation

>script/generate authenticated_mailer user


# config/environment.rb

Rails::Initializer.run do |config|
config.active_record.observers = :user_observer #追加

end


>メールの設定、日本語対応
/lib/iso2022jp_mailer.rb 作成

require 'nkf'
class Iso2022jpMailer < ActionMailer::Base
def base64(text)
if default_charset == 'iso-2022-jp'
text = NKF.nkf('-j -m0',text)
end
text = [text].pack('m').delete("\r\n")
"=?#{default_charset}?B?#{text}?="
end
def create!(*)
super
@mail.body = NKF::nkf('-j',@mail.body)
@mail
end
end


#environment.rb

#メールサーバーの設定
ActionMailer::Base.smtp_settings = {
:address => "localhost",
:port =>25,
:domain => "localhost",
}

# デフォルトの文字コード
ActionMailer::Base.default_charset = 'iso-2022-jp'


#models/user_notifier.rb #ドメイン、メールアドレスなど各パラメータを設定

 class UserNotifier < Iso2022jpMailer
 
protected
def setup_email(user)
@recipients = "#{user.email}"
@from = "ADMINEMAIL"
@subject = base64("[ユアサイト] ")
@sent_on = Time.now
@body[:user] = user
end


# Userテーブル(マイグレーションファイル)にカラムを追加

def self.up
create_table "users", :force => true do |t|
t.column :login, :string
t.column :email, :string
t.column :crypted_password, :string, :limit => 40
t.column :salt, :string, :limit => 40
t.column :created_at, :timestamp#:datetime
t.column :updated_at, :timestamp
t.column :remember_token, :string
t.column :remember_token_expires_at, :datetime
t.column :activation_code, :string, :limit => 40
t.column :activated_at, :datetime
end
end


# Userモデル(次のコードを追加)

class User < ActiveRecord::Base
attr_protected :activated_at
before_create :make_activation_code

# Activates the user in the database.
def activate
@activated = true
self.activated_at = Time.now.utc
self.activation_code = nil
self.save!

end

# Returns true if the user has just been activated.
def recently_activated?
@activated
end

protected
# If you're going to use activation, uncomment this too
def make_activation_code
self.activation_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
end

end


#Accountコントローラ

def activate
@user = User.find_by_activation_code(params[:id])
if @user and @user.activate
self.current_user = @user
#飛ばしたいところへ変更
redirect_back_or_default(:controller => '/account', :action => 'index')
flash[:notice] = "Your account has been activated."
end
end
posted by sistailsnow at 09:37| Comment(1) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2007年10月23日

userstampをつかってみた

作成,編集をしたユーザの履歴を残すためのプラグイン

acts_as_authenticatedと共に使ってみた。

参考:http://delynnberry.com/projects/userstamp

>script/plugin install svn://delynnberry.com/code/plugins/userstamp/trunk


class User < ActiveRecord::Base
cattr_accessor :current_user
end


migrationファイルで

create_table :posts do |t|
  …
 # Userstamp用
t.column :created_by, :integer
t.column :updated_by, :integer
end

を加えてrake db:migrate

class Post < ActiveRecord::Base
belongs_to :created_by, :class_name => "User", :foreign_key => "created_by"
belongs_to :updated_by, :class_name => "User", :foreign_key => "updated_by"
end


userstampを使うコントローラに

before_filter :set_current_user
protected
def set_current_user
User.current_user = current_user
end


これで Postモデルを saveするときに、現在のユーザがcreated_byもしくはupdated_byに自動で入る。

取り出す際は、これらのカラムにUserが入っているような形なので
view

@post.updated_by.login

でログインIDがとれたりする。
ラベル:Rails
posted by sistailsnow at 09:47| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2007年10月18日

ActiveRecordStore

まず、sessionの持ち方をActiveRecordStoreに変更する。
ActiveRecordStore 
>rake db:sessions:create
>rake db:migrate

environment.rb
  config.action_controller.session_store = :active_record_store
 のコメントをはずす

でOK

>model/Session.rb を作成(ログインしているユーザをセッションから取り出すため)

コンソール
>ses = Session.find(:first)
>Marshal.load(Base64.decode64(ses.data))
でとりだしたセッションsesに入っているデータをハッシュでとりだせた。
ラベル:Rails
posted by sistailsnow at 16:33| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2007年10月17日

new -> confirm -> save (imgタグの罠)

以下のようなコントローラで商品を登録するページを作成した。


def index
#sessionのクリアー
session[:product] = nil
end

def new
@product = (session[:product] || Product.new)
end

def new_confirm
@product = Product.new(params[:product])
session[:product] = @product
end

def new_save
product = session[:product]
product.save
end


すると、new_confirmを実行すると、なぜか indexメソッドが後から実行されている。おかげで、sessionにproductが保存できない。

原因は、imgタグメソッドにあった。

newで画像urlを入力するようにして、new_confirmでその画像をプレビューしていた。

その際、newでurlを空にすると、new_confirmのビューには


<img src="" />


というタグが入ることになる。
このタグが、画像を探しにindexメソッドを実行してくれたおかげで、いっつもsessionを消してくれたというわけであった。
posted by sistailsnow at 17:34| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2007年09月28日

acts_as_taggable

あるモデルに対してタグ付けを行うプラグイン

あるモデル => taggingモデル <=(has_many) tagモデル


環境 rails:1.2.3 ,ruby:1.8.6

インストール

>ruby script\plugin install acts_as_taggable


migrationファイルの生成

>rake acts_as_taggable:db:create


生成されたファイル

class AddActsAsTaggableTables < ActiveRecord::Migration
def self.up
create_table :tags do |t|
t.string :name
end

add_index :tags, :name

create_table :taggings do |t|
t.integer :tag_id, :taggable_id
t.string :taggable_type
end

add_index :taggings, [:tag_id, :taggable_type, :tag_id]
add_index :taggings, [:taggable_id, :taggable_type, :tag_id]
end

def self.down
drop_table :tags
drop_table :taggings
end
end


しかし、これではrake:migrate失敗

次のように修正

class AddActsAsTaggableTables < ActiveRecord::Migration
def self.up
create_table :tags do |t|
t.column :name, :string
end

create_table :taggings do |t|
t.column :tag_id, :integer
t.column :taggable_id, :integer
t.column :taggable_type, :string
end

add_index :taggings, :tag_id

end

def self.down
drop_table :tags
drop_table :taggings
end
end



テーブル作成

>rake db:migrate


あるモデル(タグ付けしたい)へ次のように記述

class Product < ActiveRecord::Base
acts_as_taggable
end



タグを付ける


View(create.rhtml等)

<%= text_field_tag 'tags',@product.tag_list %>

Controller
def create.rhtml
@product.tag_list = params[:tags]
@product.save
end


タグでよびだす。

controller
 def show
@tag = Tag.find(params[:tag_string])
@products = @tag.tagged
end

params[:tag_string]はタグの文字列

ラベル:Rails
posted by sistailsnow at 20:32| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2007年09月11日

ActionMailer

http://wota.jp/ac/?date=20050731

のサイトを参考にさせていただきました。
ラベル:Mail Rails
posted by sistailsnow at 14:48| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2007年09月04日

rails テキスト表示時に改行brを入れる

ヘルパーに次のようなメソッドを作成。

def insert_br(str, escape = true, br = "<br />")
if escape
return h(str).gsub(/\r\n|\r|\n/,br)
else
return str.gsub(/\r\n|\r|\n/,br)
end
end


str内に改行があれば<br /<にして出力する。
ラベル:Rails
posted by sistailsnow at 16:22| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2007年08月23日

ActiveRecorde:findとdetect

ActiveRecordeで UserとBookモデルに

User
has_many :books


といった場合に、DBからではなく、すでに実体のあるuserから、条件をつけてBookを取り出したいとする。

ArrayやHashなど、Enumerableが普通にmixi-inされているクラスであれば、 findメソッドも、detectメソッドも使える。

しかし、ActiveRecordeのfindメソッドはDBからデータを拾ってくるメソッドになっているので、detectメソッドを使う。



user.books.detect{|book| book.created_at = Datetime.now }
ラベル:Rails
posted by sistailsnow at 17:38| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2007年08月21日

select_dateと値の変換

date_selectタグの値はcontroller側で受けとるとうまいことdate型に変えてくれるのだが、select_dateタグを使うと、年、月、日がそれぞれハッシュになっていて、date[year],date[month],date[day]で値は取れるが勝手にはdate型にしてくれない。

 そこでselect_dateで出力されるHTMLをdate_selectで出力されるHTMLっぽく文字列置換してやるととりあえず、自動的にDate型に変換してくれた。

Helperで(app/helpers/application_helper.rb)

def alternate_select_date(date,options = {})
html = select_date(date,options)
html.sub!("[year]","(1i)")
html.sub!("[month]","(2i)")
html.sub!("[day]","(3i)")
end

を定義して

Viewで

<= alternate_select_date(Date.today,{:prefix => "hoge"}) >

などとして出力。

値を受けとったControllerでは

params[:hoge]

とするとDate型の値としてとってこれる。
ラベル:Rails
posted by sistailsnow at 15:07| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

タグのname属性の値指定

ActionView::Helpers::DateHelper などで、表示するHTMLタグのname属性を任意のものに変更したい場合。

たとえば
select_date(date = Date.today, options = {})


のような場合、optionsの指定で

:prefix => 任意の名前


でname属性を指定できる。


<%= select_date Date.today,{:prefix => "hoge"} %>


とすると


<select id="hoge_day" name="hoge[day]">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21" selected="selected">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select>


といったHTMLが生成できる

これは ActiveRecordオブジェクト以外のものを扱うときに非常に有効だと思われる。
ラベル:Rails
posted by sistailsnow at 10:50| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

2007年08月16日

Rails: 日付のバリデーション

Validates date time プラグイン
 Date,Datetimeのフォーマットチェック、範囲のチェックなどができるようです。

インストール
 
script/plugin install http://svn.viney.net.nz/things/rails/plugins/validates_date_time


モデル 記述例:README参照

validates_date :date_of_birth, :after => Date.new(1900, 1, 1), :before => Proc.new { 1.day.from_now.to_date }, :before_message => 'Ensure it is before %s', :after_message => 'Ensure it is before %s'


参考
http://i-am.web777.net/2006/12/validates_date_time.html
ラベル:Rails
posted by sistailsnow at 15:59| Comment(0) | TrackBack(0) | Railを走ってみた | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。