Home > Ruby Archive

Ruby Archive

ExtJS 9arrows Install作業にちょっとはまる

ExtJsとRailsの連携を参考にするため9arrowsをインストールしました。

Readmeのインストールログには不備があります。その不備を補う情報が下記サイトに載っています。
私も参考にさせて頂きました。管理者様ありがとうございます。
9arrows導入でつまづいた点をメモる

MacにRailsのpostgtesqlアダプタが入れることにはまりました。下記サイトは手動でインストールするときに参考にできるサイトです。ちなみに筆者は手動ではいれていません
Macに手動でRuby-pgを入れる

WEBrick起動時にエラー。下記解決参考サイトです。管理者様ありがとうございます。
Rails 2.2.2でのconfig. action_view. cache_template_extensions

9arrowsのインストール作業は以上です。で、下記は当初の目的の助けになるかもしれないので載せておきます。RailsとExtJsを連携させるTutorialサイト
Tutorial:Using Ext Grid with Ruby on Rails

ExtJS RSS READER

インターフェイスにExtJSをふんだんに利用したWebアプリケーション作成をしていきたいと思いまして、練習がてらサンプルを利用して作成しました。

ExtJSのサンプルからfeed-viewerを利用して、サーバサイドと連携したrss readerを動作させました。

使用した環境は以下です。

rails2.3.3
MySQL
ExtJS-3.0.0

デモを用意しました。こちらから

id : guest@example.com
password : guest

で、ログインできます。

またあとで、学んだこと、はまったことを書きたいと思います。

とりあえず

ではでは

Rails ログイン処理 その2 考察

  • 2009-07-04 (土)
  • Ruby

ログイン処理は頻繁に使用する機能なので、完全に理解して雛形として開発したいところ。
Railsはプラグインとして提供されているので、ソースを読んで理解していきたいと思います。

プラグインとしては以下二つが有名。
act_as_authenticated(1.2系)
restful_authenticated(2系)

今回はact_as_authenticatedを読んでログイン処理を考察しました。

act_as_authenticatedで特にお世話になったというか、感謝したいサイトは以下の二つ。
http://yugui.jp/articles/680
http://eringi.com/weblog/archives/2007/07/acts_as_authenticated.html

ソース内容を見ると、実行される処理の流れは

  1. まず、アプリケーション全体で「自動的にログインする」にチェックを入れた場合のオートログインチェック機能が動作します。まだログインしていない段階ではreturn falseなどで実行はされません
  2.     # When called with before_filter :login_from_cookie will check for an :auth_token
        # cookie and log the user back in if apropriate
        def login_from_cookie
          return unless cookies[:auth_token] && !logged_in?
          user = User.find_by_remember_token(cookies[:auth_token])
          if user && user.remember_token?
            user.remember_me
            self.current_user = user
            cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
            flash[:notice] = "Logged in successfully"
          end
        end
    

    処理の内容は、
    cookie[:auth]が設定されてない、また、ログインしていれば以下処理しない。
    :auth_tokenからユーザ情報を取得。次いで情報保持の有効期限をチェック。
    通れば、self.current_user = user の箇所でsession[:user]にuser.idをセット。current_userにユーザ情報をセットしています。(この部分は以下のソース)
    最後にクッキーに再度、設定。

        # Store the given user in the session.
        def current_user=(new_user)
          session[:user] = (new_user.nil? || new_user.is_a?(Symbol)) ? nil : new_user.id
          @current_user = new_user
        end
    
  3. オートログインチェックが終わって、実際のログインフォームからログインをします。その処理です。
  4.   def login
        return unless request.post?
        self.current_user = User.authenticate(params[:login], params[:password])
        if logged_in?
          if params[:remember_me] == "1"
            self.current_user.remember_me
            cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
          end
          redirect_back_or_default(:controller => '/account', :action => 'index')
          flash[:notice] = "Logged in successfully"
        end
      end
    

    大まかに言うとUser.authenticateでログインと加工したパスワードでデータベースに問い合わせます。
    またUser.authenticateでユーザ情報が返ってきてcurrent_userに情報がセットされれば、また、1個上のソースを実行しますのでsession[:user]にuser.idをセット。current_userにユーザ情報をセットしています。
    そうすれば、current_userでユーザ情報を引っ張ってこれるようになれます。

    ログインした後はセッションが切れない限り、current_userが使えて
    その他処理、login_requiredやlogged_inなどありますが、act_as_authenticateの役割はオートログイン処理、オートログインチェック処理、ログイン処理、だいたいこんなもんだと思います。(ユーザの登録処理はログイン処理ではないので、ここでは省かせていただきます。別の機会にメール処理でアクティベートする処理を考察したいと思います)

ではでは

ubuntuでRails環境構築 その2 デプロイ(Apache+Passenger)

  • 2009-06-19 (金)
  • Ruby

ではRailsアプリケーションをApache+Passengerという構成で設定した作業の覚書ですー。

PHPもApache環境で動いているので、一色単にしたかったのと、Apacheになじみがあったので敷居が低く感じられることがこの構成にした理由です。

以下のサイトを参考にさせてもらいましたー。
分かりやすい説明ですー。ありがとうございましたー。
http://d.hatena.ne.jp/rx7/20080412/p1

ではPassengerをインストールしましょう。

gem install passenger

次にApacheモジュールをインストールします。PassengerのApacheモジュールをコンパイルするには、root権限でpassenger-install-apache2-moduleコマンドを実行します。

$ sudo passenger-install-apache2-module

Welcome to the Phusion Passenger Apache 2 module installer, v2.2.3.

This installer will guide you through the entire installation process. It
shouldn’t take more than 3 minutes in total.

Here’s what you can expect from the installation process:

1. The Apache 2 module will be installed for you.
2. You’ll learn how to configure Apache.
3. You’ll learn how to deploy a Ruby on Rails application.

Don’t worry if anything goes wrong. This installer will advise you on how to
solve any problems.

Press Enter to continue, or Ctrl-C to abort.

Enterでもなんでもいいと思います。自分は1を選択しました。
で以下で、必要なぶつを教えてくれます。

Some required software is not installed.
But don’t worry, this installer will tell you how to install them.

Press Enter to continue, or Ctrl-C to abort.

——————————————–

Installation instructions for required software

* To install Apache 2 development headers:
Please run apt-get install apache2-prefork-dev as root.

* To install Apache Portable Runtime (APR) development headers:
Please run apt-get install libapr1-dev as root.

* To install Apache Portable Runtime Utility (APU) development headers:
Please run apt-get install libaprutil1-dev as root.

If the aforementioned instructions didn’t solve your problem, then please take
a look at the Users Guide:

こんな感じで必要なぶつをapt-getしてくださいと教えてくれます。
で、インストール終えてもう一回、passenger-install-apache2-moduleコマンドを打ちます。

$ sudo passenger-install-apache2-module

The Apache 2 module was successfully installed.

Passengerのインストール後はApacheの設定をします。
インストール中に以下の文があります。

(略)
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.2.3/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.2.3
PassengerRuby /usr/bin/ruby1.8
(略)

<VirtualHost *:80>
ServerName www.yourhost.com
DocumentRoot /somewhere/public # <-- be sure to point to 'public'!
</VirtualHost>
(略)

これらをhttpd.confに記述。
私の場合はLoadmoduleを/etc/apache2/httpd.confに記述
バーチャルホストの設定を
私の場合は/etc/apache2/sites-available/sitesにしました。これもふつーならhttpd.confでいいんじゃないのかな。

$ vim /etc/apache2/httpd.conf
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.2.3/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.2.3
PassengerRuby /usr/bin/ruby1.8

$ vim /etc/apache2/sites-available/sites

<VirtualHost *:80>
ServerAdmin ***@**
ServerName :*****.com
DocumentRoot /var/www/web_app/public
<Directory /var/www/web_app>
Options Indexes FollowSymLinks MultiViews ExecCGI
AllowOverride None
Order allow,deny
allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
ServerSignature On
</VirtualHost>

で、apacheの再起動をしますー。
こんな感じですー。

サブディレクトリの設定もやりましたが、redirect_toやらformのアクションがサブディレクトリを引き継いで実行してくれなかったので、辞めてしまいました。ここではその説明をしないので、図書やら別のサイトで詳細はお願いします。

ではでは。

ubuntuでrails環境構築 その1 Ruby~Rails

  • 2009-06-19 (金)
  • Ruby

ubuntuにrails環境を構築しましたー。

今後も同作業をすることもあると思うので残しときますー。
お世話になったサイトは以下です。
http://www.daokaous.com/category/computer/rails/
http://articles.slicehost.com/2009/1/6/ubuntu-intrepid-ruby-on-rails
http://d.hatena.ne.jp/rx7/20080412/p1
ありがとうございましたー。

まず、rubyに関係ないものをインストール。

pacoのインストール

ソースからインストールしたソフトをパッケージ管理してくれるありがたいソフト!
今回はソースからインストールしたものはgemだけだが、後々のことを考えて先にインストールしておく。(抜粋)

wget http://downloads.sourceforge.net/paco/paco-2.0.6.tar.gz
tar zxvf paco-2.0.6.tar.gz
cd paco-2.0.6
./configure –disable-gpaco
make
sudo make install

pacoの使用例を記述してくれていて大変分かりやすいサイトです。
http://www.daokaous.com/category/computer/rails/

で、Rubyのぶつです。

ruby1.8-dev(ruby1.8, libruby1.8) libreadline-ruby1.8, ri1.8(rdoc1.8, irb1.8) libruby1.8-dbg, libopenssl-rub(libopenssl-ruby1.8)

()の中は依存関係でくっついてくるぶつです。それぞれsudo apt-getしてください。

作業しやすいようにシンボリックリンクを作成しました。

sudo ln -s /usr/bin/ruby1.8 /usr/bin/ruby
sudo ln -s /usr/bin/ri1.8 /usr/bin/ri
sudo ln -s /usr/bin/rdoc1.8 /usr/bin/rdoc
sudo ln -s /usr/bin/irb1.8 /usr/bin/irb

次にrubygemsをソースからインストール

wget http://rubyforge.org/frs/download.php/55066/rubygems-1.3.2.tgz
tar zxvf rubygems-1.3.2.tgz
cd rubygems-1.3.2
sudo paco -D ruby setup.rb
# 作業しやすいようにシンボリックリンク作成
sudo ln -s /usr/bin/gem1.8 /usr/bin/gem

ではRailsをインストール

sudo gem update –system
sudo gem install rails

こんな感じですー。
次はデプロイと実行環境のエントリですー。

ではでは。

Rails Action_mailer 文字化け

  • 2009-06-19 (金)
  • Ruby

subjectが文字化けしてしまうことにはまった。

んでgoogle先生で調べると大体こんな感じ。
gettextが必要だからgem instal gettextをしろ、と。
メール送信のところでrequire ‘gettext/rails’とあと二つ三つしろ、と。
そして、エラー発生。
MissingSourceFile (no such file to load — gettext/rails):
そして調べると、ENV['GEM_HOME']を明示的に宣言しろ、と。

これらをやっても文字化け直らないし、メールが送られない状況も出たし、散々でした。

で、以上のものをやらなくても一発で解決してくれたのが以下のライブラリ。
http://blog.imishin.com/projects/ruby/actionmailerja/
こちらからダウンロードのページにいけます。
http://github.com/kusakari/actionmailer_ja/tree/master

ベンダープラグインフォルダに入れるだけ。なんて便利なものを作ってくださったんだ。日本語対応と携帯でのキャリア分け、文字機種依存文字の対応方法等。便利なのでは。ありがとうございました。

中身を今度、リーディングしてエントリに書いてみたいです。

ではでは。

Rails Gmailを使ったメール送信でエラー wrong number of arguments (3 for 2)

  • 2009-06-19 (金)
  • Ruby

ローカル環境でのメール処理はGmailのsmtpサーバを利用して送信していました。

railsでGmailを利用する方法は下記URLに詳しく載ってます。

http://ibushikin.blogspot.com/2009/02/railsactionmailer.html
http://yakinikunotare.boo.jp/orebase/index.php?Ruby%20on%20Rails%2FActionMailer%A4%C7TLS%A4%F2%BB%C8%A4%C3%A4%BF%A5%E1%A1%BC%A5%EB%C1%F7%BF%AE
http://www.railsforum.com/viewtopic.php?id=12875

これらのやり方はplugin配下にaction_mailer_tlsライブラリをおいてます。また他のやり方もあるようですが、まぁ今回はスルーしておきます。

でローカル環境でメール送信が成功していたものが、リモートといいますか本番サーバといいますか、とにかく外部公開サーバで動かすと下記エラーを吐くように。

wrong number of arguments (3 for 2)
/var/www/****/vendor/plugins/action_mailer_tls/lib/smtp_tls.rb:8:in `check_auth_args’
/var/www/****/vendor/plugins/action_mailer_tls/lib/smtp_tls.rb:8:in `do_start’

グーぐる先生で調べてみると発見。記述された方本当にありがとうございます。
http://d.hatena.ne.jp/shun0102/20081226/1230258029

/lib/smtp_tls.rb:8:in `check_auth_args’から
/vendor/plugins/action_mailer_tls/lib/smtp_tls.rbの8行目

check_auth_args 呼出時のパラメタ authtype を削除したらメール送信できました。

とりあえず。

ではでは。

Ruby ハッシュと配列のFind

  • 2009-05-13 (水)
  • Ruby

arrayとhashのfindクラスがどういう動きをするか分からなかったので調べてみました。

下記サイトに詳しく載っていたので引用させてもらいます。
http://homepage1.nifty.com/~tetsu/ruby/tips/

Array クラスでは、配列の要素に一致したものがあるか? という判定には Array#include? が使用できます。 これをブロックを評価した結果行なえるのが Array#find です。 実は Array クラスで include している Enumerable で定義されています。 each が定義されていれば、他のクラスでも使えちゃいます。

下のようなサンプルを見てましょう。

  PLACE_NAME_OPTIONS = [
    ['トップページ', 'top'],
    ['ニュース', 'news'],
    ['私たちの活動', 'activities'],
    ['お知らせ', 'notices']
  ]

  def real_place_name
    option = PLACE_NAME_OPTIONS.find {|o| o[1] == place }
    option ? option[0] : '不明'
  end

findのブロック内のplaceはtop,news,activities,noticesが代入されます。ここでfindの振舞いはPLACE_NAME_OPTIONSの各要素とplaceで代入される値を比較して、同値のオブジェクトがあったら、その同値の配列をoptionに代入します。

つまり、find(|item| …)は
ブロックの返り値が初めて真になったときのitemを返します。

例えば、placeにtopが代入されていれば、optionには['トップページ', 'top']が代入されます。

ちなみにもう一つ、今使用しているサンプル本の中に下記のようなソースがあってなんだこりゃ?と思った箇所がありました。一応、未来の自分のためにそこでつまづいてたよ><ってことを残しておきます。

@sets_expired_at = [true, 1, '1'].include?(checked)

trueまたは数字の1または文字列の1がcheckedの中に含まれているならばsets_expired_atにcheckedに代入します、ですね。

Rubyとxyzzy 二日目 後半

xyzzyで学んだこと

;;選択時はWindows風に
(load-library “winkey”)
;;全選択を C-a に割り当てる
(global-set-key #\C-a ’selection-whole-buffer)

 Fn + ←(Home) ショートカットキーでのタブ移動

Ruby on Railsで学んだこと

ヘルパーの使い方
リンク先が現在のページと同じ場合(current_page?(item[:link]))や利用不可の場合(item[:disabled])はspan要素を作り、そうでなければlink_toメソッドでリンクを作る

ヘルパー側(app/helper/application_helper.rb)


# Methods added to this helper will be available to all templates in the application.
module ApplicationHelper
  def menu_link_to(item)
    if current_page?(item[:link])
      '<span class="current_page">' + item[:name] + '</span>'
    elsif item[:disabled]
      '<span class="disabled">' + item[:name] + '(準備中)</span>'
    else
      link_to(item[:name], item[:link])
    end
  end
end

テンプレート側

<% menu_items = [
  { :link => { :controller => '/main', :action => 'index' },
    :name => 'TOP' },
  { :link => { :controller => '/main', :action => 'activities' },
    :name => '私たちの活動'},
  { :link => { :controller => '/main', :action => 'news'},
    :name => 'ニュース' },
  { :link => { :controller => '/blog_entries', :action => 'index' },
    :name => 'ブログ', :disabled => true },
  { :link => { :controller => '/members', :action => 'index' },
    :name => '会員名簿', :disabled => true },
  { :link => { :controller => '/admin/main', :action => 'index' },
    :name => '管理ページ', :disabled => true }
  ] -%>
<div id="menu_bar">
<% menu_items.each_with_index do |item, index| -%>
 <% if index > 0 %>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;<% end -%>
  <%= menu_link_to item -%>
<% end -%>
</div>

今後やりたいこと

シンボルの意味がいまいちなので再度復習する
xyzzyのショートカットキーでのタブ移動

Rubyとxyzzy 二日目 前半

xyzzyで学んだこと

ファイルを閉じる C-x k
次を検索/前を検索 F5/S-F5
コピー C-Insert
ペースト S-Insert

マウスだけでコピー・ペースト .xyzzyに追加

(defun mouse-right-press ()
(interactive)
(mouse-left-press)
(paste-from-clipboard))
(global-set-key #\LBtnUp ‘copy-selection-to-clipboard)
(global-set-key #\RBtnUp ‘mouse-right-press)
(global-set-key #\MBtnUp ‘mouse-menu-popup)

出所 http://chez-sugi.net/xyzzy/

rubyで学んだこと

Rubyではnumが0の場合はtrue(正しい)になります。また、空文字列「”」もtrueになります。

文字列の中に変数

puts "2かける3は#{2 * 3}です。" # 2かける3は6です。
name = "佐藤"
puts "#{name}さん、こんにちは。" # 佐藤さん、こんにちは。

インスタンス変数
「@」を付けた変数は、クラスのインスタンスごとに作られるインスタンス変数です。

class Book
  def initialize(title, price) # 初期化
    @title = title
    @price = price
  end
  def put_data # 書名と価格の表示
    puts "『#@title』、#@price円"
  end
end

book1 = Book.new('こころ', 380) # 本のインスタンス1
book2 = Book.new('明暗', 700) # 本のインスタンス2
book1.put_data
book2.put_data

インスタンス変数@….を作っても、オブジェクトの外からはインスタンス変数にアクセスできません。アクセスしたい場合は変数と同名のメソッドを用意する必要があります。
つまり、ほかのプログラミング言語のメンバ変数やプロパティに当たるものはRubyにはなく、オブジェクトのデータにアクセスするにはメソッドを書かなければならないということです。
このような読み出しや書き込み用のメソッドをアクセサメソッドと呼び、アクセサメソッドでやり取りできるデータを属性と呼びます。Rubyの属性の実態は変数ではなくメソッドであることに注意しましょう。

class Book
  def title          # 書名の読み出し
    @title
  end
  def title=(title)  # 書名の書き込み
    @title = title
  end
end

book1 = Book.new
book1.title = '草枕'
puts book1.title   # 草枕

Rubyにはもっと簡単な書き方が用意されています。attr_reader :titleと記述すると読み出し用メソッドが、attr_wrriter :titleと記述すると書き込み用メソッドが自動的に追加されます。

class Book
  attr_reader :title
  attr_writer  :title
end

# 読み書き両方のメソッドを作りたいときは、attr_accessorを使います。
class Book
  attr_accessor :title :price
end

class Book
  attr_accessor :title, :price # 読み書きできる属性

  def initialize(title, price)
    @title = title
    @price = price
  end
end

book1 = Book.new('こころ', 380)
book2 = Book.new('明暗', 700)
book1.price = 420 # 価格を変更
puts "『#{book1.title}』、#{book1.price}円" # 『こころ』、420円
puts "『#{book2.title}』、#{book2.price}円" # 『明暗』、700円

Home > Ruby Archive

Search
Feeds
Meta

Return to page top