2012年9月3日月曜日

Railsアプリ実行したら、permission denied!!

久しぶりに、Railsアプリを作ってみた。
今までと同じ環境で作ってみた。

Rails3.2
passenger
  :

rails new して、アクセスしてみたら、「permission denied」発生!!
なぜだ...

ちょっとハマってしまったのでメモ....

原因:
  新たにユーザをつくり、ホームディレクトリ上で、rails new した。
  つまり、ホームディレクトリ配下にプロジェクトができたわけだが、
  ホームディレクトリのパーミッションは、drwx------ となっている。

対応;
  上述のホームディレクトリのパーミッションを変更。  ⇒ drwxr-xr-x

結果:
  ウェブブラウザでアクセスすると、Railsアプリの初期画面が表示された。

     ...あってんのかな??

2012年4月18日水曜日

ちょっと感動したファイルアップロード

画像のアップロードを「dragonfly」ってヤツでやってみた。
実装してみて、ちょころビット感動を覚えたので、忘れないうちに...

メモ、めも...

◆なぜに、dragonfly ??
Rails2.xのころは、file_column を利用していた。
あつかったアプリ(他社が開発)が使っていたから..
いろいろテクニックも覚え、それなりに重宝していたのだが、
画像アップロード時点で、必要なサイズを作ってしまうことから、
デザイン変更のたびに、古いサイズと新しいサイズが混在する
時期が発生したり、再登録作業を終えてからリリースしたりと、
なにかと苦労してしまう。

...なにかいいものは...とグーぐる先生へ。

見つけたのが、この dragonfly !!
こいつは、表示時に、必要なサイズへとリサイズしてくれるらしい。

これなら、VIEWの変更だけですむハズ...と、利用してみる。



◆インストール
めっちゃ簡単!

Gemfile に追加して、インストールし、ちょっとだけ設定すればいい。
前提として、OSへ、image-magick が、インストール済みとします。
(もちろんディレクトリはアプリルートですよぉ)

  1. vi Gemfile
      gem 'rack-cache', :require => 'rack/cache'
      gem 'dragonfly', '~>0.9.8'
  2. bundle install
  3. vi config/initializers/dragonfly.rb
      require 'draginfly/rails/images'
        ※起動時に、 dragonfly を読み込ませるため
            initializersにファイルを作成。
◆テーブル関連

  1. アップロード先のモデルに以下を追加する。

      class table < ActiveRecord::Base
        
    image_accessor :image
        
      end
  2. テーブルに項目を追加。
     
       image_name : string
       image_uid : string
◆アップロード

   <%= f.file_field :image %>



◆表示

  1. そのまま
    <%= image_tag @table.image.url %>
  2. 縮小、拡大
    強制的に...    <%= image_tag @table.image.thumb('500x300!').url %>
                     <%=  image_tag @table.image.process(:thumb, '700x200!').url %>
    縦横比維持... <%=  image_tag @table.image .process(:thumb, '700x200').url %>
  3. 変換
    <%= image_tag @table.image.jpg.url %>
    <%= image_tag @table.image.process(:greyscale).encode(:tiff).url %>












2012年3月23日金曜日

Rails Appl からメール送信すると「end of file reached」のエラーが...


■RAILS LOG
end of file reached

■メールログ
Mar 22 18:27:22 yoru-navi postfix/smtpd[15852]: connect from localhost.localdomain[127.0.0.1]
Mar 22 18:27:22 yoru-navi postfix/smtpd[15852]: warning: SASL: Connect to private/auth failed: No such file or directory
Mar 22 18:27:22 yoru-navi postfix/smtpd[15852]: fatal: no SASL authentication mechanisms
Mar 22 18:27:23 yoru-navi postfix/master[15639]: warning: process /usr/libexec/postfix/smtpd pid 15852 exit status 1
Mar 22 18:27:23 yoru-navi postfix/master[15639]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling

■no SASL authentication mechanisms(SASLがない)???
SASLとは、コネクション・ベースのプロトコルに認証機能を付加する仕様。。らしい。
いろいろ調べたら cyrus-sasl ってのがあるらしい。

PostfixにSASLを付加するライブラリが、cyrus-sasl っでこと?

んじゃ、何が足りないか?
調査、ちょうさ...
  # rpm -qa | grep cyrus-sasl
  cyrus-sasl-devel-2.1.22-4
  cyrus-sasl-2.1.22-4
  cyrus-sasl-lib-2.1.22-4

本来は、こんなカンジ。。らしい...
  # rpm -qa | grep cyrus-sasl
  cyrus-sasl-devel-2.1.22-4
  cyrus-sasl-2.1.22-4
  cyrus-sasl-lib-2.1.22-4
  cyrus-sasl-plain-2.1.22-4
  cyrus-sasl-md5-2.1.22-4

あれ?  足りない!
  cyrus-sasl-plain-2.1.22-4
  cyrus-sasl-md5-2.1.22-4

インストールする。
yum install cyrus-sasl-plain
yum install cyrus-sasl-md5

その後、postfixを再コンパイルする必要がありそう...

2012年3月13日火曜日

Rails3.2でJavaScriptやCSSおよび画像を組込む

デザイナーが、トップページのHTML、CSSおよび、Javascriptを持ってきた。
早速Rails3.2のアプリに実装したいのだが...

Rails3.2は、アセットパイプラインって機能があって、なにものかよくわかっていない。
さらに、CoffeeScriptやら、SCSSなんていわれても..

とりあえず、この2者はおいておいて..

いただいた、HTML、CSS、JavaScript、画像を設置してみる。


■HTML設置
これは、erb形式に変換すればいいだけだから問題ないでしょう。
ただし、はじめて知ったことがあったのでメモ。

それは、グローバルナビゲーションのコーディングで..

   ↓↓ HTML は以下のようになっていた。
    <ul class="gnavi">
       <li><a href=#><img src="gn1.jpg" height="47" class="swap" /></a></li><!--
       --><li><a href=#><img src="gn2.jpg" height="47" class="swap" /></a></li><!--
       --><li><a href=#><img src="gn3.jpg" height="47" class="swap" /></a></li><!--
       --><li><a href=#><img src="gn4.jpg" height="47" class="swap" /></a></li><!--
       --><li><a href=#><img src="gn5.jpg" height="47" class="swap" /></a></li><!--
       --><li><a href=#><img src="gn6.jpg" height="47" class="swap" /></a></li>
    </ul>

 これを、
   ↓↓下のように実装すると...画像と画像の間に隙間ができる。
    <ul class="gnavi">
       <li><a href=#><img src="gn1.jpg" height="47" class="swap" /></a></li>
       <li><a href=#><img src="gn2.jpg" height="47" class="swap" /></a></li>
       <li><a href=#><img src="gn3.jpg" height="47" class="swap" /></a></li>
       <li><a href=#><img src="gn4.jpg" height="47" class="swap" /></a></li>
       <li><a href=#><img src="gn5.jpg" height="47" class="swap" /></a></li>
       <li><a href=#><img src="gn6.jpg" height="47" class="swap" /></a></li>
    </ul>
デザイナーに問い合わせた。 
  • リストのメンバーとメンバー間に、内容なしのコメント<!-- -->を入れ、更に、コメント内で改行する(赤字の部分)ことで画像間を詰めて表示できる。
  • ただし、<li>~</li>の途中で改行すると、うまくいかなかった。
らしいので、そのとおりに実装し、正常表示を確認できた。

なお、実装は、erbなので、link_toや、image_tagを用いていることは言うまでも無いデス!


■画像の設置
ページ内の画像はどこに置くか?
Rails3.2では、publicディレクトリ配下に、magesディレクトリはない。  では、どこ?
  • 画像置き場は、app/assets/images  。
  • HTMLからの参照は、上記直下なら、画像名だけでよい。
      例) image_tag "image.jpg", :alt=>"test"

■CSSの設置
CSSはどこに? ..そう、やっぱ、app/assets 配下の stylesheetsディレクトリ。
今回は、いただいた CSSをそのまま置いてみた。

ところが、CSSに直接指定する画像は、どのように記述すればいいの?

ってことで、下記。
  • まず、拡張子を〝erb〟にする。
    つまり、ルビーコードが埋め込めるってこと。
  • そんで、画像の参照は、asset_path() 関数を用いる。
       → background: url(<%= asset_path('image_bg.jpg') %>)
  • 最後に、HTMLでのLINKは、デフォルトのまま。
       → <%= stylesheet_link_tag    "application", :media => "all" %>  

■JavaScriptの設置
なんか、下のとおり、いっぱい書いてあったけど、どうすればいいの?

    <script type="text/javascript" src="./js/jquery.js"></script>
    <script type="text/javascript">
       jQuery.noConflict();
       var j$ = jQuery;
    </script>
    <script type="text/javascript" src="../js/jquery-1.3.2.min.js"></script>
            :
     (以下省略)

とりあえず、いただいたデザインで、JavaScriptが必要なのは、グローバルナビゲーションをオンマウスで変化させることだけなので、その部分だけ設置することにする。

いろいろググってみたり、app/assets/stylesheets 配下に jsファイルを置いてみたり...
んで、うまくできたのが、以下。
  • 必要なのは、
    • jquery.js
    • jquery_ujs.js
    • rollover.js
  • jquery.js と、 jquery_ujs.js はデフォルトで展開される。
  • rollover.js は、他者が作ったスクリプトなので、以下へ配置する。
    • vendor/assets/javascripts/ 
  • html.erbへの記述は、デフォルトのまま。
    •  <%= javascript_include_tag "application" %>
でも、このままではダメで、その原因は、次のコードが未実装だから。
       <script type="text/javascript">
          jQuery.noConflict();
          var j$ = jQuery;
        </script>

でも、こいつは、rollover.jsの前、jquery~の後におかなければならないらしい。
なぜなら、〝$〟関数(?)を〝j$〟に置き換えていて、それをrollover.jsが使っているから。

view への記述は、
   <%= javascript_include_tag "application" %>

そんで、展開されるのは、
    <script src="/assets/jquery.js?body=1" type="text/javascript"></script>
    <script src="/assets/jquery_ujs.js?body=1" type="text/javascript"></script>
    <script src="/assets/rollover.js?body=1" type="text/javascript"></script>
    <script src="/assets/pc/top.js?body=1" type="text/javascript"></script>
    <script src="/assets/application.js?body=1" type="text/javascript"></script>

これでは、前述の未実装コードを所定の位置に書くことができない。

なので、
  • rollover.js の〝j$〟を〝jQuery〟に変更する。

         ....無事できました。




2012年3月12日月曜日

WEB+DB(vol58)の RAILS3実践チュートリアル やってみる


Rails3.2で、 「WEB+DB(vol58)の RAILS3実践チュートリアル」を やってみた。
前出の作業リストに残りのチュートリアルを書き加えていく。

■ブログ投稿機能実装
  ①rails new aplname -d mysql --skip-bundle
  ②cd aplname
  ③vi Gamfile  -> gem therubyracer  を追加。
  ④bundle install

  ⑤JQuery本体のありか
     ここから、jQueryの最新バージョンのCDNをチェック
       ->http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.j  だった..
  ⑥設定
     vi app/assets/javascripts/application.js
        ->削除) //= require jquery
     vi app/views/layouts/application.html.erb
           (追加) <%= javascript_include_tag                          
                                 ' http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js  %>
   
  ⑤vi config/database.yml
        -> 11 development:
            12   adapter: mysql2
            13   encoding: utf8
            14   reconnect: false
            15   database: aplname_development
            16   pool: 5
            17   username: dbuser           # DBMで生成
            18   password: dbpass           # DBMで生成
            19   socket: /var/lib/mysql/mysql.sock
  ⑥rake db:create
  ⑦rails g scaffold post title:string body:text         #ブログ投稿機能生成
  ⑧rake db:migrate
  ⑨rake                                                         #テストしてみる
         ->  :
            Finished in 0.001814 seconds.
            0 tests, 0 assertions, 0 failures, 0 errors, 0 skips
              :
  ⑩vi app/models/post.rb
         -> validates :title, :presence => true, :length => {:maximum => 20} 
                        (項目) (入力必須)          (最大長20文字)          
                 # 項目ごとに設定できるため、可読性がよくなった SexyValidation 記法
  ⑪コンソールから確認
       rails c
          ->Post.create!
             ->ActiveRecord::RecordInvalid: Validation failed: Title can't be blank
          ->Post cretae! :title => 'ぽ' *21
             ->ActiveRecord::RecordInvalid: Validation failed: Title is too long
                 (maximum is 20 characters)

          ->Post cretae! :title => 'ぽsuと'
             ->INSERT INTO `posts` (`body`, `cre  .....
                追加されたOK!
          ->quit

■コメント投稿機能実装
  ①モデルとテーブル生成
     rails g model comment post:references comment:string name:string
     rake db:migrate
  ②コントローラ生成
     rails g controller comments
  ③投稿とコメント各データの関連を設定
     vi app/models/post.rb  -> has_many :comments を追加。

         ## modelで、post:references と指定すると、
         ## 自動的に、項目名が、post_idとなり、
         ## model上にも belongs_to:post が追加されるのね..

  ④コメントのためのルーティング
     vi config/routes.rb
        ->resources :posts do
             resources :comments, :only =>[:new, :create]
           end
  ⑤コメント投稿画面(ブログ記事詳細表示画面下部に設置)
     vi app/views/posts/show.html.erb
        -><hr>
          <%= render @post.comments.build %>
                # buildした commentsインスタンス をrender に渡すと
                # 規約で、comments/_comment という名前のパーシャルを指す。
 
  ⑥...なので、comment投稿フォーム作成は次のとおり
     vi app/views/comments/_comment.html.erb
        -> <%= form_for [comment.post, comment] do |f| %>
                  :
               <div class="field">
                 <%= f.submit %>
               </div>
            <% end -%>
  ⑦コメント登録アクションを実装
     vi app/controllers/comments_controller.rb
        -> def create
              post = Post.find params[:post_id]
              post.comments.create params[:comment]
              redirect_to post
            end
  ⑧最後に投稿されたコメントの表示(ブログ記事詳細表示画面下部に設置)
     vi app/views/posts/show.html.erb (以下を追加)
        -> <p>
              <b>comments</b>
              <% @post.comments.each do |comment| %>
                 <p><%= "#{comment.comment} by #{comment.name}" %></p>
              <% end -%>
            </p>

■ActiveModelで検索機能を実装
   Rails3から登場した「ActiveModel」を使えば、データベースのカラムと連動しない
   フィールドを持つモデルっぽいのが作れるらしい。
   これで、検索機能を作ってみる。

  ①モデル生成
     vi app/models/search_form.rb   (新規作成)

        -> class SearchForm
               extend ActiveModel::Naming
               include ActiveModel::Conversion      #この2行と persisted? で
                                                                #form_for の引数に使えるようになる。
                 :
               def initialize(param)
               end
  
               def persisted?
                 false
               end
            end

  ②検索フォームを一覧画面の先頭に設置
     vi app/views/posts/index.html.erb
        -> <%= form_for @search_form, :url =>posts_path, :html =>{:method =>:get} do |f| %>
               :
             <% end -%>   #シンボル :search_form 先に作ったモデルをあらわす。
                          

....

あれ? JQueryがデフォルト??

これまで、Javascriptを除いた状態で、rails new して、Jquery を使えるようにと、四苦八苦してたら...

な・なんと、Rail3.1からは、JQueryがデフォルトになっていると...

ナので、アプリから作り直しました(涙)

rails new aplname -d mysql --skip-bundle
cd aplname
bundle install --path vendor/bundle
     :
   Installing execjs (1.3.0)
     :
   Installing jquery-rails (2.0.1)
     :

         ## 何もしないのにインストールされたようです。

■でも、scaffold でエラーになる???

rails g scaffold post title:string body:text
    /home/yoru-navi/blog_app/vendor/bundle/ruby/1.9.1/gems/execjs-
         1.3.0/lib/execjs/runtimes.rb:50:in `autodetect': Could not find a JavaScript runtime. See
         https://github.com/sstephenson/execjs for a list of available runtimes.
         (ExecJS::RuntimeUnavailable)
     from /home/yoru-navi/blog_app/vendor/bundle/ruby/1.9.1/gems/execjs-1.3.0/lib
           /execjs.rb:5:in `<module:ExecJS>'
     from /home/yoru-navi/blog_app/vendor/bundle/ruby/1.9.1/gems/execjs-1.3.0/lib
          /execjs.rb:4:in `<top (required)>'
         :
         :

なんで..?   therubyracer  がインストールされていないなぁ...
  ◆確認
    ①bundle list | grep therubyracer

  ◆インストールしてみる。。
    ①Gamfile に  gem therubyracer  を追加して、
    ②bundle install
    ③scaffold を再実行。  →できた!!

■ここまでの作業をまとめると...(ブログっぽいAPLを作る)
  ①rails new aplname -d mysql --skip-bundle
  ②cd aplname
  ③vi Gamfile  -> gem therubyracer  を追加。
  ④bundle install
  ⑤vi config/database.yml
        -> 11 development:
            12   adapter: mysql2
            13   encoding: utf8
            14   reconnect: false
            15   database: aplname_development
            16   pool: 5
            17   username: dbuser           # DBMで生成
            18   password: dbpass           # DBMで生成
            19   socket: /var/lib/mysql/mysql.sock
  ⑥rake db:create
  ⑦rails g scaffold post title:string body:text         #ブログ投稿機能生成
  ⑧rake db:migrate
  ⑨rake                                                         #テストしてみる
         ->  :
            Finished in 0.001814 seconds.
            0 tests, 0 assertions, 0 failures, 0 errors, 0 skips
              :
 

2012年3月8日木曜日

開発環境 VIM PowerUP

Railsに便利なVIMのプラグインをインストールしてみた。
かなり便利になるハズ。。

■vim.ruby
git clone http://github.com/vim-ruby/vim-ruby.git
cd vim-ruby/
git checkout vim7.3
rake package
gem install etc/package/vim-ruby-2012.03.08.gem
sudo gem install etc/package/vim-ruby-2012.03.07.gem
cd bin
sudo ruby vim-ruby-install.rb
ll ~/.vim

■rails.vim
Vundleを使わないでインストール。

①cd ~/.vim
②wget http://www.vim.org/scripts/download_script.php?src_id=10297
③unzip rails.zip

...これだけでOK。
   ※ただし、今回、autoloadディレクトリのオーナーが、
     rootになっていたため失敗した!
     ちゃんと次のディレクトリが更新できるようにしておこう!
       ①~/.vim/autoload、②~/.vim/doc、③~/.vim/plugin

・使い方
  ファイル間移動:
    gf ... カーソル位置の文字列から適切なファイルを開く
    :R ... Controller ⇔ View
           Model      ⇒ 関連のMIGRATION ⇒ 次のMIGRATION
    :A ... Controller ⇔ Test
           MIGRATION  ⇒ 前のMIGRATION
  
・rails.vimじゃないけど...
   :ls              ... バッファーリスト
   :b<バッファ番号> ... バッファ番号のファイルに移動
   
■NERDtree (ProjectをTree表示..:Rprojectコマンドは廃止された)
 wget http://www.vim.org/scripts/download_script.php?src_id=11834
 unzip NERD_tree.zip

・使い方
  vim から、:NERDTree を叩くと、開いているファイルのプロジェクト
  ツリーが表示される。



Ctrl + ww ツリーと編集中のバッファ間を移動。 
ツリーウィンドウで、m 新規ファイル、移動、削除、コピーのメニュー表示。
キャンセルは、escキー。