【Ruby】Ruby on Rails Part6
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/10/24(金) 17:46:53ID:???http://pc11.2ch.net/test/read.cgi/php/1207425569/
■参考サイト
<英語>
本家:http://www.rubyonrails.org
API document:http://api.rubyonrails.com/
開発者のblog:http://weblog.rubyonrails.org/
参考wiki:http://wiki.rubyonrails.org/rails
<日本語>
Rails' wiki: http://wiki.fdiary.net/rails/
■参考スレ
Rubyについて Part 33
http://pc11.2ch.net/test/read.cgi/tech/1223709050/
Ruby 初心者スレッド Part 22
http://pc11.2ch.net/test/read.cgi/tech/1221467121/
0034nobodyさん
2008/11/12(水) 19:14:27ID:???つか、みんなどんなエディタ使ってる?
#定期的に出る話題だとおもうけど、すまんのう。
0035nobodyさん
2008/11/12(水) 20:21:19ID:???vi使ってる人もたくさんいると思うけどvi使うのが不便なのかい?
0036nobodyさん
2008/11/12(水) 21:41:34ID:???0037nobodyさん
2008/11/12(水) 21:42:52ID:???マカーなので一番多いのはTextMateだがな。
最近NetBeansもお試し中。
0038nobodyさん
2008/11/13(木) 00:23:40ID:???色づけとソース整形ができれば十分。
0039nobodyさん
2008/11/13(木) 00:50:35ID:???ttp://wota.jp/ac/?date=20060105
ttp://d.hatena.ne.jp/MillyC/20080924/1222255886
この辺にscoped_methodsの話があるけど、
ちょっとコードが複雑で追い切れてない。
with_scopeみたいにブロックの範囲内じゃなく、
任意のタイミングでscopeの開始、終了したいときは、
こんな感じでinstance_evalでscopet_methodsに
scopeをpush,popするだけでいいのかな。
def my_scope
{
:find => {:conditions => ["name <> ?", "name1"] }
}
end
Page.instance_eval do
self.scoped_methods << my_scope
end
pages = Page.find(:all)
Page.instance_eval do
self.scoped_methods.pop
end
0040nobodyさん
2008/11/13(木) 01:38:23ID:vZzK0dowpassengerを入れて、apache2を自動起動にして、
OSをリブートすると、apache2の自動起動に失敗するようです。
ログイン後、
$ sudo apachectrl start
だと、ちゃんと起動するのですが。
httpd.confから、passenger絡みの記述を削除すれば、正常に自動起動します。
何が悪いのでしょう。。。
0041nobodyさん
2008/11/13(木) 10:22:29ID:???Hope this helps.
code.google.com/p/phusion-passenger/issues/detail?id=131
>The following code change resolves the problem on my machine:
>1. Edit ext/apache2/Hooks.cpp
>2. Go to the function 'init_module'.
>3. Change 'delete hooks;' to '// delete hooks;'
>4. Reinstall Passenger.
0042nobodyさん
2008/11/13(木) 11:53:31ID:???それとも、viアプリケーションみたいなのがあるの?
Emacsだと、Terminalでも使えるけど、最近はウィンドウアプリケーションとして使ってる人が多いよね。CarbonEmacsとか。
同じように、viでもウィンドウアプリケーションがあるのかな。
0043nobodyさん
2008/11/13(木) 12:09:13ID:???0044nobodyさん
2008/11/13(木) 13:18:40ID:???たとえば「会社」に「倉庫」が必ず1つあって、
そこで「商品」を扱う場合、
class company < ActiveRecord::Base
has_one :storage
end
class storage < ActiveRecord::Base
belongs_to :company
has_many :goods
end
class goods < ActiveRecord::Base
belongs_to :storage
end
ってなると思うんだけど。
倉庫自体はとくに固有のデータは持たなくて、
ActiveRecordの操作系メソッドが欲しいだけなんけど、
storagesテーブルは作成しなくちゃならないのかな。
モデル上、会社が直接商品を操作するんじゃなくて
手続きの集合としての倉庫クラスを置きたいんだけどさ。
0046nobodyさん
2008/11/13(木) 21:33:30ID:???会社オブジェクトにその手続きを持たせても構わないんじゃないの?
「現実にあるモノとそれらの関係」をそのままモデル化する必要はない。
0047nobodyさん
2008/11/13(木) 21:34:48ID:???end
class Company < AR::Base
include StorageOperations
end
とか。
0049nobodyさん
2008/11/14(金) 03:14:57ID:???vimとscreenとbashでやってる。
macだからTerminal.app上で。
rails.vimはいれてるけど、使かわなくなってる。てか使いこなせてない。
まわりに使ってる人もいないし、
emacsやほかのエディタと比較してどうかはわからない。
0050nobodyさん
2008/11/14(金) 03:29:40ID:???思ったよりメモリ食うイメージがあって手を出してないんですが
0051nobodyさん
2008/11/14(金) 10:27:06ID:???趣味で試すには面白そう。
でも仕事はRailsかな。
チームのみんながある程度習熟してないと困るし。
0052nobodyさん
2008/11/14(金) 17:04:20ID:???0053nobodyさん
2008/11/14(金) 20:01:15ID:???メモリーの使用量は変らない。
1プロセス、35MB以上くう。
railsはメモリーくいすぎ。
0055nobodyさん
2008/11/14(金) 23:44:05ID:???rubyが悪いのか、ActiveRecordがわるいのか、ActionPackか?
PHPでなんかしらのフレームワーク使った場合と比べてどうなんすかね
0056nobodyさん
2008/11/16(日) 03:32:41ID:???create_table :hosts do |t|
t.binary :macaddr, :limit => 6
t.string :hostname
end
のようなテーブルを作って、MACアドレスをバイナリで保存する処理を考えているのですが、
Host.find_by_macaddr(mac_bin)
のようにMACアドレスで検索しようとしたらログに
ActiveRecord::StatementInvalid: SQLite3::SQLException: unrecognized token: "'": SELECT * FROM "hosts" WHERE ("hosts"."macaddr" = '') LIMIT 1
と出力され、うまくいきません。
Host.find_by_macaddr(ActiveRecord::ConnectionAdapters::SQLiteColumn.string_to_binary(mac_bin))
のようにすることで一応動くのですが。
0057nobodyさん
2008/11/17(月) 00:52:51ID:???RailsでURLをクリックした時に、そのURLをcontorollerに渡す方法はありますか?
URLは、link_to title,urlで生成されているものです。
0058nobodyさん
2008/11/17(月) 03:21:33ID:???コントローラではrequest.url、request.request_uriあたりじゃね?
何が返るのかは定義を見ること。
# 実は referr?er だったり……
0059nobodyさん
2008/11/18(火) 01:48:36ID:???「URLをパラメータにする Rails」あたりでぐぐる
006057
2008/11/21(金) 03:55:17ID:???そんなやり方があったのですね、どうもありがとうございます。
重ねてまた聞きたいのですが、外部のサイトに飛びつつactionも呼ぶことって出来ますか?
具体的に言うと、yahooの検索apiから結果を取得してresultsに入れたものを
view上で
<% @results.each do |result| %>
<li><%= link_to result.Title, result.ClickUrl %></li>
<% end %>
のように書き、このリンクをクリックした時にactionを呼び出して、そこでrequest.urlを使って色々とやりたいのですが。。
0062nobodyさん
2008/11/21(金) 21:49:12ID:???コントローラの中で @results が得られて、それをビューで一覧。
ビューに示されたリンクを辿ると最終的に該当URLに飛ぶ、ということか。
コントローラに
def goto
redirect_to params[:url] # 値に対してなんらかの検証をしたほうがいいかも。
end
みたいなリダイレクト専用アクションを用意して
<%= link_to h(result.Title), :action => 'goto', :url => result.ClickUrl %>
JavaScriptが使えるならクライアントサイドのみで
<%= link_to_function h(result.Title), %Q|location.href="#{result.ClickUrl}"| %>
とかも可能かも。
0063nobodyさん
2008/11/22(土) 04:30:32ID:???なら >>61-62 みたいに、リダイレクトが一番素直でしょ。
でもこれだと訪問済リンク問題がでるから、これを避けたい場合 >>62 みたいにJavaScriptを使うことになる。
Googleの検索結果ページは後者だよね。
0064nobodyさん
2008/11/22(土) 06:12:17ID:???<%= link_to_remote h(result.Title), :url => { :action => 'goto', :url => result.ClickUrl } %>
か?
0065nobodyさん
2008/11/22(土) 21:19:46ID:???migrationしてデータベースと Hoge modelだけ作って、
./script/console からデータベースをいじってる。
hoge = Hoge.new() してhoge.name = hage などしてデータを入れて、
hoge.save をした。
その後 hoge2 = Hoge.find(:all, :conditions=>"name = hage") をして
データを呼び出したんだが、これが array クラスになってしまって、
hoge2.name で hage を呼び出せない。
要は Hoge.find で呼び出したデータを簡単に Hoge クラスとして扱いたい。
どうしたらいいのか教えてほしい。
0066nobodyさん
2008/11/22(土) 21:48:48ID:???name = "hage" がユニークなら、Hoge.find(:first, :conditions => ["name => ?", "hage"]) や
Hoge.find_by_name("hage") とすればいい。
あるいは、仕様上 name = "hage" のオブジェクトが複数存在するなら、
hoges = Hoge.find(:all, :conditions=>"name = hage")
hoges.each{|hoge| do_something} と複数のオブジェクトに対して順に処理すればいい。
0067nobodyさん
2008/11/22(土) 22:02:19ID:???0068nobodyさん
2008/11/23(日) 01:08:31ID:???0069nobodyさん
2008/11/23(日) 04:16:51ID:???http://www.tutorialspoint.com/ruby-on-rails-2.1/index.htm
を参考に初めてrailsやってるんですが、
http://www.tutorialspoint.com/ruby-on-rails-2.1/rails-views.htm
まできて、 /book/list にアクセスした際に、「テンプレートが無い」ではなく、「uninitialized constant BookController::Book」となりました。
見た感じ、BookControllerというクラスにBookなんて変数無い、と見えたので、BookControllerのlistメソッドを下記のように変更したら、次に勧めました
def list
+ @books = Books.find(:all)
- @books = Book.find(:all)
end
これはチュートリアルの間違いですか?それとも2.1と2.2.2の違いですか?
0070nobodyさん
2008/11/23(日) 06:20:47ID:???0071nobodyさん
2008/11/23(日) 06:22:06ID:???ruby script/generate Book とすべきところを
ruby script/generate Books としてしまったのではないかと思うのだが。
0072nobodyさん
2008/11/23(日) 06:23:02ID:???0073nobodyさん
2008/11/23(日) 13:43:37ID:???app/modelsにbooks.rbがあるのと、コマンド履歴に>71がありました。
どう見てもtypoです。本当にありがとうございました。
0074nobodyさん
2008/11/24(月) 02:00:37ID:???0075nobodyさん
2008/11/24(月) 03:10:41ID:???0076nobodyさん
2008/11/24(月) 13:43:36ID:???入門向けコーナーができたらしい
0078nobodyさん
2008/11/25(火) 17:37:28ID:???model? controller? それともどっか別の場所?
0079nobodyさん
2008/11/25(火) 18:49:48ID:???ActiveRecord::Errorsオブジェクト。
validate対象オブジェクトのerrorsメソッドで取り出せる。
validateを自分で定義したりvalidates_eachの場合は
errors.addで自分でエラーを突っ込む必要がある。
http://api.rubyonrails.org/classes/ActiveRecord/Validations.html
http://api.rubyonrails.org/classes/ActiveRecord/Errors.html
0081nobodyさん
2008/11/26(水) 16:26:48ID:???0082nobodyさん
2008/11/26(水) 22:20:54ID:???0083nobodyさん
2008/11/27(木) 14:54:31ID:???0086nobodyさん
2008/11/28(金) 04:24:33ID:???rubiniusは縮小らしいですからね…
ところでRails画像アップロードプラグインって今もFile_columnが最強ですかね?
0087nobodyさん
2008/11/28(金) 15:14:55ID:???0088nobodyさん
2008/11/28(金) 16:09:21ID:???>アンテナ低すぎ。
Railsはメディアが取り上げたりしてるから、盛り上がってるのはわかる。
でもMerbは個人のブログでその名をちょくちょく見かける程度で、どうみても盛り上がってるようにはみえない。
だから、どこでMerbが盛り上がってるのか聞いたんだけど?アンテナ高い>>85が教えてくれ。
0089nobodyさん
2008/11/28(金) 16:14:38ID:???Merbにするメリットってあんまりないきがする。
0090nobodyさん
2008/11/28(金) 18:14:03ID:???end
だけれど、これってどのモデルのtransactionメソッド呼ぼうが
違いは無いという認識でよい?
テーブル毎にトランザクションの単位がかわるわけではないし。
0091nobodyさん
2008/11/29(土) 12:20:47ID:???0093nobodyさん
2008/11/29(土) 20:11:35ID:???booksテーブルを作成し、カラムを追加する手順です。
■booksテーブルを作成
./script/generate model Book
■booksテーブルにカラム作成するためにファイル編集
vi db/migrate/20081129110040_create_books.rb
class CreateBooks < ActiveRecord::Migration
def self.up
create_table :books do |t|
t.string :title
end
end
以下略
■DB作成
rake db:create
■migrate
rake db:migrate
booksテーブルが出来る。カラムはidとtitleのみ
0094nobodyさん
2008/11/29(土) 20:12:29ID:???■booksテーブルにnameカラムを追加するためにファイル編集
./script/generate migration books_add_name
vi db/migrate/20081129110451_books_add_name.rb
class BooksAddName < ActiveRecord::Migration
def self.up
add_column(:books, :name, :text, :default=>'')
end
def self.down
ramove_column(:books, :name)
end
end
■migrate
rake db:migrate
ここまででbooksテーブルを作成し、カラム追加ができるのですが、以下が疑問です。
・booksテーブル作成時、 ./script/generate model Book のように「Book」と単数形で実行したのに、何故出来上がるのは「books」という複数形なのか
・そもそもスキーマを変更する手順はこれで合っているか
以上をよろしくお願いします・・
0095nobodyさん
2008/11/29(土) 20:17:49ID:???ファイル編集せずに
$ ./script/generate model Book title:string name:text
とかやった方がいいよ。
なんでnameがtextなのか知らんけど。
本番になるまではテーブルなんて壊し放題なんだから
add_columnとかするよりも元のファイル書き換えて
$ rake db:migrate VERSION=0
$ rake db:migrate
で作り直しちゃった方が良い。
0096nobodyさん
2008/11/29(土) 20:51:55ID:???> CoC。テーブル名は複数形
「設定より規約」で、「テーブル名は複数形、そのテーブルを扱うモデルは単数形」というルールがあるから、
自動的に複数形になるってことですか?
> ファイル編集せずに
ファイル編集した理由が、
http://www.tutorialspoint.com/ruby-on-rails-2.1/rails-active-records.htm
に従ったからなんですが、開発時のスキーマ定義は普通generateの引数に取るものなのですか?
開発時の常識とか、普通はこうする、とかを全然知らないので分からないので、変なところがあれば指摘してもらえると助かります。
参考に、redmineと9arrowsのソースを見たのですが、redmineはスキーマ変更用のマイグレーションファイルがたくさんあって、
9arrowsはスキーマ作成用のしかなかったので、95氏のいうような手法のようです。
> 本番になるまではテーブルなんて壊し放題なんだから
確かに開発時はその方法の方がスマートですね。
本番になった後にスキーマ変更したい場合なのですが、>94の方法は変なことをやっていますか?
0097nobodyさん
2008/11/29(土) 21:41:46ID:???本番になった後はもちろんそうする。
ただスキーマ定義はgenerateの引数の方が手っ取り早いかな。
generateしたあとでファイル開いて編集するの面倒だし。
あと、generateコマンド使うと勝手に複数形になってしまうので
そういうもんだと思った方がいい。
generateコマンド使わないなら、テーブル名を単数形にすることもできる。
class Book < ActiveRecord::Base
set_table_name 'book'
end
0099nobodyさん
2008/11/29(土) 23:40:23ID:???そのために下記のページを参考にしているのですが、暗号の作り方
の部分がいまいちよく分かりません。
ttp://d.hatena.ne.jp/nyaago69/20080904/1220519371
特にdef self.new_salt の中身が分かりません。
rand.to_s.tr('+', '.') と書いてありますが、randを使ってる限り
その中に+が入り込むことはないと思いますし、
s[0, if s.size > 32 then 32 else s.size end]
は何をやっているのか分かりません。
解説をお願いします。
0100nobodyさん
2008/11/30(日) 00:19:54ID:???「s[0, if s.size > 32 then 32 else s.size end]」は
RubyのStringには「self[nth, len]」という書式があって、
文字列のnthバイト目から長さlenバイト目までの部分文字列を新しく作って返す
よって質問文の意味は、sの最初から32バイト以上ならsの32バイト分、それ以下ならsを返すという意味になる
ていうかこんな書き方できるんですね、勉強になりマスタ
0102nobodyさん
2008/11/30(日) 00:58:12ID:???新顔でPaperclipというのが出た。
http://www.thoughtbot.com/projects/paperclip/
attachment_fuから乗り換えた人の記事。
http://thewebfellas.com/blog/2008/11/2/goodbye-attachment_fu-hello-paperclip
0103nobodyさん
2008/11/30(日) 01:53:51ID:???カラム定義の次に Config.create() したら「createなんてメソッド無いよ」と言われ、
どー見ても合ってるのにと思ってしばらく悩んだ結果、
Config がrailsの予約語だったからのようなのですが(confにしたらテーブル作成に加えcreateもできたので)、
予約語に使われている語はテーブルにすら使ってはいけませんか?
0104nobodyさん
2008/11/30(日) 01:59:30ID:???0105dai
2008/11/30(日) 08:55:02ID:mlKxK2ns2つのmodelを定義して、片方にだけ{カラム名}_columnを指定しようとした
のですが、同じカラム名を使っていると両方のmodelに適用されてしまうの
は仕様でしょうか。
例えば、
ruby script/generate model aaa title:string name:string
ruby script/generate model bbb title:string name:string
のようにmodelを生成し、各controllerにactivescaffoldの設定を行った後
にaaa_helper.rbにのみtitle_columnを設定。
------------
class AaaController < ApplicationController
active_scaffold :aaa do |config|
:
------------
module AaaHelper
def title_column(record)
link_to(h(record.title), :action=>:●●●)
end
end
------------
こうすると、title_columnを設定していないbbbのtitleにもlink_toが適用
されてしまいます。
(ruby1.8.6、rails2.0.2、activescaffold1.1.1)
0106nobodyさん
2008/11/30(日) 11:11:34ID:???日付を保存するのにDateクラスを使ってます。
このDateクラスのデータを上手く使ってweeks.agoなどの
演算をしたいのですが、どのようにすればいいのか分かりません。
よろしくお願いします。
0107nobodyさん
2008/11/30(日) 13:07:05ID:???じゃだめってこと?
0109nobodyさん
2008/11/30(日) 14:56:43ID:???Magazine_titleというモデルとMagazineというモデルを作りました。
それぞれ以下のような関係性を持たせています。
class MagazineTitle < ActiveRecord::Base
has_many :magazines
end
class Magazine < ActiveRecord::Base
belongs_to :magazine_title
end
ここで、MagazineTitleのパラメータ次第で、Magazineの
パラメータを設定したいと考えています。具体的には、
magazine_title.cycle == "weekly" であった場合、
magazie.sale_close_date = magazine.sale_date + 1.weeks
としたいのです。
これを出来ればmodelでやりたいのですが、
そのような方法はあるでしょうか?
それともcontorollerでやる方が適切でしょうか?
どうかご助言をお願いします。
0110nobodyさん
2008/11/30(日) 15:06:05ID:???メソッドを定義してしまえばいいんじゃない?
class Magazine
def magazine_title=(mt)
write_attribute(:matazine_title, mt)
write_attribute(:sale_close_date, sale_date + 1.week)
end
end
0111nobodyさん
2008/11/30(日) 15:07:23ID:???0112nobodyさん
2008/12/03(水) 11:06:41ID:???詳しく丁寧に教えてください。
0113nobodyさん
2008/12/03(水) 11:15:31ID:???0115nobodyさん
2008/12/04(木) 13:49:56ID:ORX+Oq69これをコンソールじゃなくてファイルに出力するにはどうしたらよいのでしょうか?
0117115
2008/12/04(木) 20:40:28ID:ORX+Oq69$ script/server > /tmp/test.log 2>&1
としても/tmp/test.logに出力されなかったです
0118nobodyさん
2008/12/04(木) 22:28:19ID:???こちらの環境ではファイルに出力されますねぇ。
(バッファされるので時間差があるけど。)
というかlog/development.logではだめなんですか。
0119115
2008/12/05(金) 12:07:03ID:KklI24b5/tmp/test.logは作成されますが、中身が空のままになります
時間差ってどれ位ですか?
log/development.logだと、何時にどこからどんなmethodで
どんなリクエストがあってどんなステータスコードを返したかとかが
わからないので、WEBrickが吐き出すログが欲しいんです
0120nobodyさん
2008/12/05(金) 18:54:48ID:???svr = WEBrick::HTTPServer.new(:AccessLog=>設定内容}
詳しくはリファレンスマニュアルとソース読め
railsでどのファイルをいじればいいかは知らん
0121nobodyさん
2008/12/06(土) 00:13:43ID:???WEBrickほとんど動かしてないからあれだけど。
mongrelのlog/development.logならお望みのものは分かるような。
0122nobodyさん
2008/12/06(土) 00:23:19ID:???/ruby/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/commands\servers\webrick.rb
(paramsらへん)
/ruby/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/webrick_server.rb
結局はlog4rとか使うのがよいのかも
使ったことないけど
0123nobodyさん
2008/12/07(日) 02:47:53ID:???環境は?
OS(じつはwindows?)とかシェル(じつはcsh?)とか分かれば
アドバイスもらえるんじゃね?
うちでは普通にリダイレクトできるけど。
Mac OS X/bash/Rails 2.1.2。
0124nobodyさん
2008/12/07(日) 07:09:39ID:???0125115
2008/12/08(月) 16:06:58ID:pc3akaHEOS:CentOS 5.2
シェル:bash
この様な環境です
アプリ変えるとかソースいじるとかも解決方法になるのですが、
今出力されているものをファイルに向けるだけだと簡単に解決できるので
リダイレクトで処理したいのですが、なぜかリダイレクトできません…
なぜできないんだろう…
0126nobodyさん
2008/12/09(火) 17:03:00ID:???0127nobodyさん
2008/12/09(火) 17:04:02ID:???0128115
2008/12/09(火) 21:41:09ID:Sc6VNW/K# script/server -p 3001 > /tmp/access.log 2>&1
ちゃんと付けてるのですが、やっぱりファイルに書き込まれません…
0130nobodyさん
2008/12/10(水) 23:53:47ID:???./script/generate migration add_user_id_to_book user_id:integer
としたらint(11)なuser_idというカラムを追加するようなファイルができたのですが、カラムを複数追加するとき、カラム設定を複数書くとき(user.idにリファレンス張るとか)はどう書いたらいいですか?
0131nobodyさん
2008/12/11(木) 00:09:40ID:???そのたびにファイル作ってたら、ファイル数えらい事になる。管理しにくい。
カラム足したりするmigration使うのは本番運用後で良いかと。
■ このスレッドは過去ログ倉庫に格納されています