Home > Ruby On Rails

Web 酒 肴

«前へ || 1 | 2 || 次へ»

[RoR][NetBeans]ログイン認証プラグインacts_as_authenticated

Ruby on Railsのプラグインについての話も少しだけしていこうと思う。 色んな便利なプラグインがあるそうで、まだ全然知らないんだけど、プラグインを組み合わせてアプリケーションを作れば色んな場面で楽ができそう。 これってCMSで色んなプラグインやモジュールを使用して、プログラミングレスでサイト構築していくのに似てるなって思った。

PCがモバイル化して携帯に近づいていき、携帯が機能面でPCに近づいていく今の状況とも似ているような気が。 MODxの社長だっけ?「いつかWEBプログラマを必要無くすることが我々の仕事だ」みたいなことを言ってた人って。 あり得なくはないと思った。 実際にはプログラマが完全にいなくなることはないと思うけど、サービスを提供する人ではなくてプラグインやフレームワーク、OSを提供する立場になっていくのではないだろうか。

さて、話を戻してログイン認証のプラグイン。 これを使えばRailsにおいて、ユーザ認証という部分がほぼ自動的に作成される。

基本機能

  • ユーザ登録画面(ID、パスワード、メールアドレス入力)
  • 入力チェック(必須入力項目や、文字数制限など)
  • ログイン機能
  • ログアウト機能
  • ログイン状態の記憶(次回から自動的にログイン後の画面が表示される)

さらにもう少し手を加えれば以下のようなこともできるらしい

追加機能

  • メール送信による本人確認

現在一般的に普及しているWEBのサービスでされている認証は大方このプラグインでできてしまうのではないだろうか。 それではこのプラグインをNetBeansで導入する手順を一通り確認していこう。

続きを読む

[RoR]Ruby on Railsチュートリアル #1

久しぶりにRailsでちょっとしたアプリを作ろうとしたら、かなり色々忘れてて大変だった。 今度忘れた時のためにちょっとまとめとこう。

環境

さくらインターネットでRailsアプリを新たに作成した際、以下の作業を忘れてはいけない。

public/.htaccessの修正

# 以下の3行をコメントアウト(先頭に#を付ける)します 
AddHandler fastcgi-script .fcgi 
AddHandler cgi-script .cgi 
Options +FollowSymLinks +ExecCGI 

config/environment.rbの修正

以下の2行を追加してください
$LOAD_PATH.push("$HOME/ruby/lib/ruby/site_ruby/1.8") 
$LOAD_PATH.push("$HOME/ruby/lib/ruby") 

apacheから見えるように設定

cd $HOME/www 
ln -s $HOME/work/hoge/public {$APP} 

以上、参照元:Ruby on Rails を入れる(さくらインターネット)

routes.rbの修正

これは必須ではないが、URLを単純化するために。 設定内容は以下のサイトが詳しい。

優しいRailsの育て方 - ノk|*‘-‘)<ノリマツ!愛だよ、愛!

controller系

他のアクションと同じ画面遷移をさせる

render :action => "他のアクション名"

リファラの参照

request.referer

その他のrequestオブジェクトの中身はこちらの記事参照。つーか、ここめっちゃ見やすい。このエントリーもぶっちゃけこのサイトの真似だったりする。

requestオブジェクトの中身 - Rails開発日記

その他Rubyの基本

クラスの初期化はinitializeコンストラクタで

つーか、そこまで忘れてどうする。インスタンス変数を作成するのに四苦八苦。

[RoR]routes.rbの更新が反映されない

さくらインターネットのレンタルサーバでRuby on Railsを動かしている。 ふとデフォルトのwelcome画面をそのままにしていたことに気付き、config/routes.rbを修正。 これでTOPページのURLが単純化された、、、はず。

ところがroutes.rbの変更をどうやって反映したらいいのかわからない。共用のレンタルサーバだからApacheの再起動とかもできないし。

色々と調べていくうちにrakeタスクの中で設定を更新するようなものもあった。しかしconfig/boot.rbとかそんなんばっか。肝心のroutes.rbを更新するタスクは見つからなかった。

悩んだ挙句、welcomeページに表示されているpublic/index.htmlを削除したらうまくいくことに気付いた。う~ん、なんか釈然としない。だけどindex.htmlを削除するってのはよく考えたら基本だな。以前翻訳した記事でもそう書いてた(って何のために翻訳したんだか。)

翻訳記事

[勝手に日本語訳] Getting Started With Ruby and Rails

[勝手に日本語訳] Getting Started With Ruby and Rails

以下の記事の日本語訳が無いようなので、勝手に翻訳してみた。
それが許されるのかどうかはこれから問い合わせて、問題があるなら削除します。 日本語訳もだいぶ適当だし。伝わりやすい意味を重視したつもりですので、正確な訳にはなっていない場所も多々あると思います。意味としてもおかしい部分があれば、ぜひご指摘ください。

元記事は以下。

Getting Started With Ruby and Rails

このチュートリアルはあなたが即座にNetBeans IDEでRubyやRuby on Railsのアプリケーションを開発できるようにしてくれるでしょう。このチュートリアルはアプリケーション開発におけるいくつかのよくあるケースにおいて、あなたがどのようにIDEのRubyサポートを使用するかを教えてくれます。

このチュートリアルは順番どおり進める必要がありません。必要なところだけを素早く拾い読みし、時間があれば各セクションを見直すという読み方で構いません。順番どおり進める形式のチュートリアルがよければ、まずRubyでBlogを10分で作るを参照するのがよいでしょう。

目次

続きを読む

GoogleMapでマッシュアップの練習(Rails編) #7

では最終的に作ったソースをもとに解説していく。

main_controller.rb

require 'net/http'
require 'rexml/document'
require 'cgi'

class MainController < ApplicationController

  def index
  end
  def search
    #HTTP通信設定(rgoecode)
    site = Net::HTTP.start('refits.cgk.affrc.go.jp')

    #地名情報取得  ← 1
    response = site.get("/tsrv/jp/rgeocode.php?lon=#{params[:x]}&lat=#{params[:y]}")
    resXML = response.body
    site.finish

    #XML要素から都道府県名と都市名を取得する  ← 2
    @got, @pref, @munic = get_name_of_place(resXML)

    unless @got then   # ← 3 
      @resText = "Error!"
      render(:layout => false)
      return
    end

    #HTTP通信設定(郵便番号)
    site = Net::HTTP.start('webservice.est.co.jp')

    #郵便番号情報取得  ← 4 
    response = site.post("/zipcode/SearchEngine.asmx/FromAddress2", "Address=" + CGI.escape(@pref + @munic))
    @got, @zipcode = get_zipcode(response.body)  # ← 5 
    unless @got then  # ← 6
      response = site.post("/zipcode/SearchEngine.asmx/FromAddress2", "Address=" + CGI.escape(@pref))
      @got, @zipcode = get_zipcode(response.body)
    end
    site.finish

    #HTTP通信設定(旅行記)
    site = Net::HTTP.start('api.4travel.jp')

    #旅行記情報取得  ← 7 
    response = site.get("/Ver1/SearchAlbum.php?zip=#{@zipcode}&oc=utf8")
    @travel_info = TravelInfo.new response.body   # ← 8 
    site.finish

    #郵便番号に-(ハイフンを入れる)
    @zipcode.insert(3, "-")
  end

  def get_name_of_place xml
    #XMLツリー作成
    docTree = REXML::Document.new xml

    #ステータス取得(地名の取得が成功したかどうか)

    status = docTree.elements.each("/rgeocode/status"){}[0].text
    return false, "取得失敗", "取得失敗" if status != "true"

    #都道府県取得
    @pref = docTree.elements.each("/rgeocode/prefecture/pname"){}[0].text

    #都市名取得
    @munic = docTree.elements.each("/rgeocode/municipality/mname"){}[0].text

    return true, @pref, @munic
  end


  def get_zipcode xml
    #XMLツリー作成
    docTree = REXML::Document.new xml

    #ステータス取得(地名の取得が成功したかどうか)
    status = docTree.elements.each("/FindList/TotalFindCount"){}[0].text
    return false, "" if status == "0"

    #郵便番号取得
    zipcode = docTree.elements.each("/FindList/Item/FindItem/ZipCode"){}[0].text

    return true, zipcode
  end
end

メインはsearchメソッド。
これがGoogleMapの地図上をクリックしたときに呼び出されるメソッド。

番号をつけているあたりで以下の処理をしている。

  1. ジオコードから地名をXML形式で取得
  2. 取得したXMLから都市名、町名などを取得(get_name_of_placeメソッド呼び出し)
  3. 取得できなければ終了
  4. 地名をもとに郵便番号をXML形式で取得
  5. 取得したXMLから郵便番号を取得(get_zipcodeメソッド呼び出し)
  6. 取得に失敗したらリトライ(町名は外して県名のみで取得)
  7. 郵便番号をもとに旅行記をXML形式で取得
  8. 取得したXMLから旅行記の配列を取得(TravelInfoクラス ※ソースは下)

旅行記のXMLを解析し、Travelogueというクラスのインスタンスにする。
それを旅行記の配列をTravelInfoが保持している。
この2つのクラスはコントローラから呼び出せるようにhelpersの下に配備する。

travel_info.rb

require 'rexml/document'

class Travelogue
  attr_accessor :album_title, :album_url, :traveler, :traveler_url, :picture_url, :picture_link, :area, :area_url, :description
  def initialize(doc)
    @album_title = doc.elements.each("albumtitle"){}[0].text
    @album_url = doc.elements.each("albumurl"){}[0].text
    @traveler = doc.elements.each("traveler"){}[0].text
    @traveler_url = doc.elements.each("travelerurl"){}[0].text
    picture_url = doc.elements.each("picture"){}
    picture_url = doc.elements.each("pictlist/picturl"){} unless picture_url
    @picture_url = picture_url[0].text if picture_url.size > 0
    picture_link = doc.elements.each("pictlist/pictlink"){}
    @picture_link = picture_link[0].text if picture_link.size > 0
    area = doc.elements.each("area"){}
    @area = area[0].text if area.size > 0
    area_url = doc.elements.each("areaurl"){}
    @area_url = area_url[0].text if area_url.size > 0
    description = doc.elements.each("description"){}
    @description = description[0].text.split(//u)[0..100].join.gsub /\r?\n/, "<br />\r\n" if description.size > 0
  end
end

class TravelInfo
  attr_accessor :num_of_results, :travelogue_array
  def initialize(xml)
    #XMLツリー作成
    docTree = REXML::Document.new xml

    #検索結果件数取得(旅行記の取得が成功したかどうか)
    num_of_results = docTree.elements.each("/results/numofresult"){}
    if num_of_results.size > 0
      @num_of_results = num_of_results[0].text 
    else
      @num_of_results = 0
    end
    @travelogue_array = []

    if @num_of_results != 0 then
      docTree.elements.each("/results/travelogue/item"){|travelogue|
        @travelogue_array << Travelogue.new(travelogue)
      }
    end
  end
end

さて、これで必要な情報は取得できたわけだが、それを画面上に表示できるようにHTMLに変換してやる必要がある。
これはsearchメソッドと結びつくviews/main/search.rhtmlを作成すれば自動的に呼び出される。

search.rhtml

<div id="search_area">
  <div class="search_info">
    <h3>検索条件</h3>
    <div class="search_parts">
      <div class="search_lable">都道府県名</div>
      <div class="search_word"><%= @pref %></div>
    </div>
    <div class="search_parts">
      <div class="search_lable">都市名</div>
      <div class="search_word"><%= @munic %></div>
    </div>
    <div class="search_parts">
  <%
    if @got then
  -%>
      <div class="search_lable">郵便番号</div>
      <div class="search_word"><%= @zipcode %></div>
  <% else -%>
      <div class="search_lable">郵便番号</div>
      <div class="search_word">取得失敗</div>
  <% end -%>
    </div>
  </div>
  <div id="search_result">
<%
    if @travel_info != nil && @travel_info.num_of_results != 0 then
      @travel_info.travelogue_array.each{|t|
-%>
    <div class="an_result">
      <div class="travel_title">
        <a href="<%= t.album_url %>" target="_blank"><%= t.album_title %></a>
        <% if t.area %>
        (<a href="<%= t.area_url %>" target="_blank"><%= t.area %></a>)
        <% end %>
      </div>
      <div class="travel_description">
      <% if t.picture_url %>
      <a href="<%= t.album_url %>" target="_blank"><img src="<%= t.picture_url %>" align="left"/></a>
      <% end %>
      <% if t.description %>
      <%= t.description %>
      <% end %>
      </div>
      <div class="traveller">
        <a href="<%= t.traveler_url %>" target="_blank"><%= t.traveler %></a>
      </div>
      <br style="clear: both;" />
    </div>
  <% } %>
  <% else %>
  見つかりませんでした.
  <% end %>
  </div>
</div>

eRubyがわかれば特に難しい事はしていない。
検索情報と、検索結果をHTMLにしているだけだ。
ただし、作る方はこういうデザインに一番時間がかかるんだけどね。
そしてそれっぽく見えるスタイルシートをフリー配布のところからダウンロードしてきて適用。
最終的にこんな感じになりました。

旅行記検索サイト

GoogleMapでマッシュアップの練習(Rails編) #6

エマージェンシー発生

フォートラベルのAPIを再確認してみたところ、地名からの旅行記取得の仕様が期待していたものと違う。「北海道」とかいうパラメータで旅行記が取得できると思っていたけど、それは無理。「hokkaido」というアルファベット形式で送信しなくてはならない。漢字の地名をいちいちアルファベットに変換なんて面倒だしやりたくない。ということで別の方法を考えなくては。こういう見切り発車な性格は災いもおおいけど、勢いがなくては何も始められない。と肯定的に捉えてみる。

調査を続けるとフォートラベルでは残された方法は一つしかなかった。それは郵便番号による検索。

ということで住所から郵便番号を取得する処理を一つ追加する。APIはぽすたんというサービスを見つけた。さっそく組み込んでみる。

処理内容はこういうふうになる。

[修正前]

  1. GoogleMAP上をクリック
  2. 住所取得(京都市など)
  3. 旅行記取得(これができない)

[修正後]

  1. GoogleMAP上をクリック
  2. 住所取得(京都市など)
  3. 郵便番号取得(605xxxxなど)
  4. 旅行記取得

上記処理を実装するのに、あれやこれやと結構時間を食ってしまって。
その経緯をブログに残すのを忘れてた・・・。
突然だけど、急転直下で次回完成!!!
(テキトーですみません)

GoogleMapでマッシュアップの練習(Rails編) #5

4travelにパラメータとして地名を送信するには、返されたXMLの中から地名だけを取りだす必要がある。難しいことはしないけどRubyでXMLをいじった経験はなし。きっとそういうライブラリがあるはず、と思って探すとREXMLというものを発見。日本語情報が少なくここを参考になんとかやってみた。

REXML:RubyによるXML処理

どうもREXMLの日本語情報が少ないようで、これ以上調べるのも時間がかかりそうな気がしたので、見よう見まねでかなり強引に作ってみた。きっともっとスマートな方法があるはず。main_controller.rbにget_name_of_placeというメソッドを追加し、そこにXMLのデータを渡すと都道府県名と都市名を別々にようにした。取得失敗時は取得失敗という文字を返す。

main_controller.rb

require 'net/http'
require 'rexml/document'

class MainController < ApplicationController

  def index
  end
  def search
    #HTTP通信設定
    site = Net::HTTP.start('refits.cgk.affrc.go.jp')

    #地名情報取得
    response = site.get("/tsrv/jp/rgeocode.php?lon=#{params[:x]}&lat=#{params[:y]}")
    resXML = response.body
    site.finish

    #XML要素から都道府県名と都市名を取得する
    pref, munic = get_name_of_place(resXML)

    #画面表示用のテキスト整形
    @resText = "都道府県名:#{pref}  都市名:#{munic}"

    render(:layout => false)
  end

  def get_name_of_place xml
    #XMLツリー作成
    docTree = REXML::Document.new xml

    #ステータス取得(地名の取得が成功したかどうか)
    status = docTree.elements.each("/rgeocode/status"){}[0].text
    return "取得失敗", "取得失敗" if status != "true"

    #都道府県取得
    pref = docTree.elements.each("/rgeocode/prefecture/pname"){}[0].text

    #都市名取得
    munic = docTree.elements.each("/rgeocode/municipality/mname"){}[0].text

    return pref, munic
  end
end

今回もサーバサイドのみの変更なのでそのまま地図をクリック。よし、成功!僕の住んでる近辺を狙って何度かクリックするものの、なかなか難しい。よし、面白くなってきたぞ。

家からは少し離れてるけど・・・

«前へ || 1 | 2 || 次へ»

Home > Ruby On Rails

Search
Feeds

Page Top