2009年12月9日水曜日

rails,erbファイルでのCase文について

RubyでのCase文の書き方は,

case a       #変数
when "xxx" then  #xxxだった時、~~~を実行
~~~
when "yyy" then  #yyyだった時、~~~を実行
~~~
else        #それ以外、~~~を実行
~~~
end

となる。


rails上のerbファイルで書く時は、

<%case a%>
<%when "xxx"%>
<%when "yyy"%>
<%end%>

と書きたくなるが、これはSyntaxErrorとなってしまう。

<%case a
when "xxx"%>
<%when "yyy"%>
<%end%>

と書くのが正解。
要注意。

rails,文字列?

i と "#{i}" の違いが分からない。

<% i = 0 %>
<% @syllabus_exams.examinations.each do |exam| %>
<%= exam.date.strftime("%Y/%m/%d") %>
<%= link_to(exam.title,{:action => "show",:detail => exam.id,:id => params[:id],:count => i}) %>
<% unless params[:count].nil? %>
<% if params[:count] =="#{i}"%> ←ここね
<%= render :partial => 'detail' %>
<% end%>
<% end %>
<%= params[:count]%><% i += 1%>
<% end %>

rails,Date型

ActiveRecord において、複数の型がテーブルのスキーマとして利用できる。

そのうち時間に関するものは

:datetime  日時型

:timestamp タイムスタンプ型

:time     時刻型

:date     日付型

と4つある。

今回はDate型を使うこととした。

Dateクラス(?)において使えるメソッドは結構多い。

参考
http://www.ruby-lang.org/ja/man/html/Date.html

便利。今度は他の型も使ってみたい。

2009年12月7日月曜日

rails,2重ハッシュ作成

2重ハッシュを作りたい。

Hash.new としてハッシュを作成するのだが、一発では作成できない(らしい)


よくわからんから、おまじないを唱える

my_hash = Hash.new{|h,k| h[k]=Hash.new(&h.default_proc)}


これで

my_hash[:xxxx][:yyyy] = "zzz"

とかいけます。

ありがたや。
http://rubist.blog77.fc2.com/blog-entry-167.html

2009年12月6日日曜日

rails、 ActiveRecordについて(多対多)

find メソッドにより,関連テーブルを取ってきたい。(階層的に)

ちなみに

student
↑(1)

↑(N)
rishu
↓(N)

↓(1) 
syllabus

すなわち、

student
↑(N)

↓(N)
syllabus

という関係。


まず、宣言として、
-----
#rishu.rb

class Rishu < through ="">:rishus
end
-----
#syllabus.rb

class Syllabus < through =""> :rishus
end
-----

このようにする。

controller にて

@rishu_classes = Student.find(:all,:conditions => ['student_ID = ?','xxxx'],:include => {:rishus => :syllabus})

とし、変数に格納し、
viewにて

<% @rishu_classes[0].rishus.each do |rishu| %>
<%=rishu.syllabus.class_NAME%>
<% end %>

とした。

ここで、2行目の部分は、
       (rishu.syllabus.class_NAME)
student[0].rishu[0].syllabus.class_NAME
           [1].syllabus.class_NAME
            ・
            ・
            ・
という感じ。
つまり、"student"配列の要素0→"rishu"それぞれのハッシュをeach→"syllabus.class_NAME"を呼び出すというようになっている。

ここで、最後に出たエラー

-----

NoMethodError in Juko#show

Showing app/views/juko/show.html.erb where line #9 raised:

You have a nil object when you didn't expect it!
The error occurred while evaluating nil.class_NAME

-----

意味が分からないが、結局は、

rishus のテーブルにおいて、

rishu1:
student_id: 2053932785
syllabus_id: 153075031

と決めていたidが間違っていて対応していなかっただけだった。


しかもidは定義できるという・・・・

2009年12月4日金曜日

Ruby、ActionMailerについて

自動メール送信機能について


ruby ○○.rb

で起動し、メール送信できるプログラムを作りたい。

Rubyでyahooメール送信 その2

http://istb16.spaces.live.com/blog/cns!65DCED8E05792EA!128.entry

ここでは、Ruby の'net/smtp' をつかってメール機能を実現する。
実際に動かしたところ、argument エラー。
後藤先生に聞いたが分からず。


次に,
各フリーメールでのActionmailer の設定

http://terrazilog.quipu.jp/?eid=591548

ここでは、Ruby の'ActionMailer' を使ってメール機能を実現する。
Gmail ⇒ Rails の環境なので却下(活用法が分からない)
ロリポップ ⇒ 知らんがな
Yahoo! ⇒ PopBeforeSMTP を使ってるらしく、ログインできない。


結局、本番用の環境で(localhost)前者のプログラムを動かす。
ActionMailer が無難でありそう。

2009年12月1日火曜日

rails、 :includeの使い方について

Ruby on Railsについて。(個人情報はxxxx)

Active Recordの:include の機能を利用して2つのテーブルを結合しようとしたところ、エラー。


G先生: :include はN 対1 の1 側からしか発行できないよ。

じぶん: ぇ・・・

G先生: とりあえずSQL を直接発行した方がいいかな。

じぶん: mjsk


いろいろ調べたがSQL を使おうとした際に,困ったことが

テーブル'grade' (多) とテーブル'syllabus' (1) で,
@grades = Grade.find_by_sql("SELECT grade.* syllabus.* from grade, syllabus where grade.class_ID = syllabus.class_ID and grade.gakuseki_number = 'xxxx';")
とすると、Gradeクラスからの発行となり、おかしい。

初心に帰り、:include の勉強をすることに。

↓↓↓
・結果
:include 使える。

原因は各テーブルのモデルにあったらしい。

-誤
※grades.rb
class Grade < ActiveRecord::Base
belongs_to :syllabuses
belongs_to :students
end

-正
class Grade < ActiveRecord::Base
belongs_to :syllabus, :foreign_key => 'syllabus_id'
belongs_to :student,:foreign_key => 'student_id'
end
#belongs_to (対1) なのでテーブル+(e)sはおかしい
#foreign_key として'対象のテーブル名_id' を指定する

とする。

また,:includeの利用方法は
@grades = Grade.find(:all,:conditions => ['gakuseki_number = ?','xxxx'],:include => :syllabus)
とする.
※ポイントは:include => :syllabus

テーブルsyllabusのメソッドを呼び出すときは
@grades.syllabus.○○
とすればよい。


参考URL
http://code.nanigac.com/source/wiki/view/641/50
以上。