0

Railsでユーザー認証

Railsでユーザー認証するプラグインは、いくつか存在するけど、一番扱いやすいのはacts_as_authenticatedと思います。

で、インストールしようと思ってがんばったけど、メール認証のところでどうしてもこける。
結局、googleで検索したらこちらのブログで丁寧な解説をされていたのでソースをそのまま拝借したところ、うまくいきました。感謝感謝。

ログイン後のページでようこそ○○さんとかだすのは、これでOK
ようこそ< %= current_user.login %>さん

ただ、このacts_as_authenticatedはユーザーがログインしてるかどうかを毎回DBに読みにいってる?のでパフォーマンス的には問題があります。
そこを調査修正したいけど、rubyをイマイチ理解してない自分には骨の折れる作業です。

railsの生産性の高さがすばらしいとされるけど、やはりrubyを覚えないことにはphpでごりごり書くとの劇的な変化はないと思う。
rubyをある程度覚えた後のrailsほんとすごい。

まずはruby。
関係ないけど、美しいコードが書けるスクリプト言語はPythonに限る。

0

railsでメール送信

railsでメールを送信するには、Iso2022jpMailerを使います。デフォルトのActionMailerを使うのですが、これはutf-8のみということでIso2022jpMailerのほうが便利です。

Iso2022jpMailerは、ActiveHeart という日本の環境で使いやすくするためのpluginに梱包されています。
具体的には以下の3 つのライブラリから構成されています。

ActiveRecordMessagesJa – ActiveRecord のヴァリデートメッセージの日本語化
ActiveRecord のヴァリデートメッセージを日本語に置き換えます。英語がハードコーディングされている部分にも対応しています。
TransSid – session を cookie でなく URL で引き回す
日本の携帯には cookie の使えない機種が多くあります。そのような端末でも session を使えるようにします。
Iso2022jpMailer – 日本語メール送信処理
メールを送信する際、文字コードを iso-2022-jp に変更します。

インストール
# ./script/plugin install http://svn.rails2u.com/public/plugins/trunk/active_heart

scaffoldみたくジェネレートしてやる
# ruby script/generate mailer ContactMailer result

モデル
class ContactMailer < Iso2022jpMailer
def result(random)
@subject = 'タイトル'
@body["random"] = random
@recipients = 'hoge@hoge.com'
@from = 'hoge@hoge.com'
@sent_on = Time.now
@headers = {}
end
end

コントローラーで呼び出し
methodにdeliver_をつけるのがみそ
def sendmail
ContactMailer.deliver_result(rand())
end

result.rhtml
下記URLより本認証を行ってください。
http://192.168.128.115:3000/account/setup?rid=<%= @random %>

0

Railsのテーブル名で使う複数形を調べる

Railsでは、DBのテーブル名は複数形でそれに紐ずくmodelは単数形となります。
でもこれは非英語圏の人間からすると困った規約です。

これを助けてくれるコマンドはRailsで備えています。
いつものscript/server~ではなく、コンソール上で行います。
でもまずは、いつもの。
ruby script/console

そして単数形を複数形に。
>> "user".pluralize
=> "users"

これでテーブル名を命名する幅が広がりそう。

0

Ruby on Railsでhas_manyを使いデータを取得

articlesとreviewsが1対多の関係ので、両方のテーブルからデータ取得するときは:includeオプションを使うに限る。

aa = Article.find(:all, :include=>:reviews)
pp aa

結果
#<Article:0xb6dc1f5c
@attributes=
{"image_url"=>"/images/test1.gif",
"category"=>"筆記具・修正用品",
"price"=>"4500.00",
"title"=>"Test1",
"date"=>"2006-06-21 19:00:00",
"id"=>"1",
"description"=>"テスト1です。",
"vender"=>"test"},
@reviews=
[#<Review:0xb6dc14f8 @attributes={"com"=>"コメント1", "id"=>"1", "article_id"=>"1"}>, #<Review:0xb6dc123c @attributes={"com"=>"コメント2", "id"=>"2", "article_id"=>"1"}>]>

0

Ruby on Railsでデバッグ

Ruby on Railsのデバッグする方法は色々紹介されてるけど、一番オーソドックスであろうppを使ってみた。
案の定はまったけど、phpのprint_rに一番近いので手になじみやすいかも。
まず、コントローラーのclassの記述より上で呼び出し
require 'pp'
そして、コードのどこかに下記にように記述
pp @articles

phpをやる人間からすると当然ブラウザに変数が吐き出されるかと思いがちだけど、WEBrickのログ?みたいな感じでコンソールに表示されます。
これがわかるだけでも開発効率は高まりそう。

0

Ruby on Railsスタート

Ruby on Railsをちょくちょく勉強しては壁に当たってやめてしまってたけど今回はちょっと本腰いれて勉強中。
参考にさせてもらってるサイトは色々あるけど、一番参考にしてるのはこのサイトです。

レベル低すぎて人に見せたくないけど、とりあえず思いついたまま覚書メモ。

■DBの設定
テーブルの作成。
Migrationとかまだよくわかってないので手動で作成。
気をつけるとことは、やはりテーブル名を複数形にすること。
idはrailsの規約上「id」。
複数形にできないテーブル名のときはどうすんだろう?
drop table if exists articles;

create table articles (  id         int         not null   auto_increment,
  title        varchar(100)   not null,
  description   text        null,
  image_url    varchar(200)   not null,
  price       decimal(10,2)   not null,
  date       datetime      not null,
  vender     varchar(100)   not null,
  category    varchar(100)   not null,

  primary key (id)
);

■DB情報をrailsに知らせる
DBへの接続情報をプロジェクト以下のconfig/database.ymlに記述
yml形式なので:の後は空白をあける
production:
adapter: mysql
database: office
username: root
password: hoge
host: localhost

■scaffoldでCRUD作成
これでモデルもコントローラーも同時に作成
ruby script/generate scaffold Article Admin
モデル名は「Article」、コントローラー名は「Admin」をscaffoldで作成という意味。
命名規則があり、テーブル名はすべて小文字の複数形で、モデル名はテーブル名の単数形、先頭の文字が大文字というふうにする。

■サーバー起動
最終的にはapacheで動かすけど、テスト時はrailsのサーバー(WEBrick)を使います。
このサーバーはポート3000を使うのでアクセス時は、http://localhost:3000/admin/listという感じでつなげる。
ちなみにこのadminはコントローラー名、listはその中で定義されてるメソッド名
ruby script/server
バックグランドで走らす場合
ruby script/server -d
これでとりあえずOK
http://localhost:3000/admin

0

ruby on railsでコードを自動生成

ruby on railsで必ず使うscaffold。
よくあるリスト、新規登録、編集、削除のフローを自動作成してくれます。
この自動作成には2通りのやりかたがあります。

一つが、よく紹介されてる、contollerでsaffoldを明示するやりかた。
RoR入門サイトとかによく見かけ、非常に簡単です。
ただ欠点が、コードが見えない。
レイアウトを少し変えようかなと思ってももviewのコードが生成されてないので変更しにくい。
app/controllers/contact_controller.rb
class ContactController < ApplicationController
model :contact
scaffold :contact
end

で、もう一つのやりかた。
ruby script/generate scaffold contact contact

このやり方だと下記のようなファイルも生成されます。
create app/views/contact/list.rhtml
create app/views/contact/show.rhtml
create app/views/contact/new.rhtml
create app/views/contact/edit.rhtml

注意しなければならないのが第二引数にコントローラー名を明示すること。
しないと、下記のように複数系で気持ち悪い感じになります。
create app/views/contacts/list.rhtml
create app/views/contacts/show.rhtml
create app/views/contacts/new.rhtml
create app/views/contacts/edit.rhtml