Ruby
- rubyの構文(&&を用いた条件分岐について)
ruby初心者です。 最近、ruby on railsで書かれたソースを引き継ぎ解析を行っています。 その中で、以下のような構文が出てきました。 ========================================= num = 0 bool = false vals = '' puts 'start' num == 0 && bool && if vals puts 'true' else puts 'false' end puts 'end' ========================================= 上記プログラムを実行すると、if ~ end までが実行されませんでした。 そこで、変数boolをtrueに変更して再実行したところ、if文が実行されました。 そこで私は、上記プログラムは以下と同値であると解釈しました。 ====================================== (省略) if num == 0 && bool if vals puts 'true' else puts 'false' end end ======================================= 以上を踏まえて・・・ 1.私の解釈は正しいでしょうか? 2.間違っている場合、正しい処理の解釈を教えていただけますでしょうか?または参考URLを教えていただけますと助かります。 文の最後に"&&"がついている文を見たことがなく、ネットで調べても 正解らしいものが掲載されていなかったので質問させていただきました。 拙い説明で申し訳ありませんが、よろしくお願いいたします。
- ベストアンサー
- Ruby
- k-s1h9u8n3
- 回答数1
- gem install railsで「NameError」
gemでrailsを指定ディレクトリにインストールをしようとしているのですが、railsのインストールでエラーが出てしまいます。 rubyはもともと入っており、管理者権限などが無いため、 rubygemsを指定ディレクトリ以下にいれgemコマンドで ←gem install rails --include-dependencies を投入したところ、 →ERROR: While executing gem ... (NameError) uninitialized constant Digest::MD5 のエラーが表示されてしまいます。 gem -vなど、正常に実行されるコマンドもあります。 原因などわかる方がいらっしゃれば、教えていただきたいです。 ・バージョン、場所 rubygems:1.3.1 指定ディレクトリ/rubygems ruby:1.8.7 /usr/local/lib/ruby
- クラスメソッドのインスタンスメソッドからの呼び出し
クラスメソッド“say”を定義しました。 クラス外からこれを呼び出すときは Hoge.say 'hello' で、同じクラス内の、インスタンスメソッド“hello”からクラスメソッド“say”を呼び出したいとき、クラス外から呼び出すのと同じように呼び出すことはできました。 class Hoge def self.say(word) puts word end def hello Hoge.say('hello') end end しかし、メソッド“hello”内にHogeというクラス名を直書きしたくないのですが、どんな文法を使用すればよろしいでしょうか? # Hoge#hello内での試行錯誤 self.say 'hello' => エラー say 'hello' => エラー ひょっとして、クラス名を直書きする以外手段はないのでしょうか・・?
- RubyOnRailsでDB(MicrosftSQLServer)にアクセスしたい
RubyOnRailsでMicrosoftSQLServerをDBとしたアプリを作ろうとしているのですが、正常に動作せず、 no such file to load -- deprecated というエラーが出てしまいます。 どなたか、回避策をご教授願えないでしょうか? ネット上で調べた限りでは、 gem install deprecated でdeprecatedをインストールしてあげれば、改善するという書き込みもあったのですが、deprecatedのパッケージがないというエラーで失敗してしまいます。 環境:NetBeans6.5 OS:WindowsXP DB:MicrosftSQLServer Express2005 よろしくお願いします。
- パラメータ
【データベース】 テーブル名:Fruits +----+---------+ | id | name | +----+---------+ | 1 | りんご | | 2 | みかん | | 3 | なし | | 4 | パイン | +----+---------+ 【コントローラ】 @fs = Fruits.find(:all) 【ビュー】 <% @fs.each do |f| %> <span style="white-space: nowrap;"><%= check_box "fs", f.id, :checked => nil %> <%= hl(f.name) %></span> <% end %> 【ログ】 りんごとパインを選択しました。 Parameters: {"fs"=>{"1"=>"1", "2"=>"0", "3"=>"0", "4"=>"1"}} チェックリストで選択した値を得たいのですがどのようにしたら得られますか??
- rubyにおけるPOSTされたデータの処理について
言語はRubyです。 場面としては、railsにPOSTされたパラメータを受け取ってオブジェクトであるdetaを保存しているところです。 #case1 #params = {'a' => 1, 'b'=> 2 ,'c' => 3} #case2 #params = [{'a' => 1, 'b'=> 2 ,'c' => 3}, {'a' => 4, 'c' => 5}] if params.kind_of?(Array) params.length.times do |i| @deta.new if a = params[i]['a'] end if b = params[i]['b'] end if c = params[i]['c'] end @deta.save! end else @deta.new if a = params['a'] end if b = params['b'] end if c = params['c'] end @deta.save! end paramsが配列の可能性がある上、 paramsのハッシュである a, b, c のキーが毎回存在するかわからないので、 if文で例外がでないようにチェックしています。 自分で書いてて冗長な感じがして気持ち悪いです。 なにかよい方法があれば、教えてください。 よろしくお願いします。
- Ruby プログラミング
"cronで /dog/cat/bird の中の一日より前の古いファイルを消す"というプログラムを作っていただけませんか? 完全に初心者で本を見ながらなんですがどうしていいか分かりません。。 ※Rubyでお願い致します。 ※1文1文説明を付けてくださるとありがたいです。。 どうかお願い致します。。。。。
- AJAXを使用したサイトに対するgetelementsbytagname("td")について
プログラミング初心者です。 fifiaのランキングのページ(http://www.fifa.com/worldfootball/ranking/lastranking/gender=m/fullranking.html)を対象にして、スクレイピングを行おうとし、 require("win32ole") ie =WIN32OLE.new("InternetExplorer.Application") でIEオブジェクトを取得し、 ie.visible =true ie.Navigate("http://www.fifa.com/worldfootball/ranking/lastranking/gender=m/fullranking.html") while ie.busy == true sleep 0.1 end ここまではいいのですが、表の中の値を取得しようと ie.document.getelementsbytagneme("td") を実行してみてもnilが帰ってきてしまいます。 HTMLのソースを表示してみても<td>タグは含まれているはずなのですが、試しにie.document.getelementsbytagname("td").lengthを実行してみると0が返ってきてしまい、どうしたらいいのかさっぱりわからない状態です。 ie.document.getelementsbytagname("div")などはちゃんと機能するので、おそらく問題の原因は<td>タグがAJAX.updaterメソッドを使ったページの内容更新の対象となっていることだと思うのですが、いかんせん不勉強で解決方法がわかりません。 どなたか詳しい方、ご教授していただけないでしょうか。
- Ruby expect 条件文(if文)の書き方
Rubyでexpectライブラリを利用して、対話的な処理を自動で行おうと思っています。 その場合に、条件文(if文)をどうやって書いていいのか分からず困っています。 ※条件文の必要のないサンプルプログラムは検索したところいろいろあったのですが・・・ 例えば spawn("ssh #{hostname}") do expect(/User \(.*\): /) { |match| user } expect(/[Pp]assword: /) { |match| pass } expect(/[\>\$] /) {|match| command } このcommmandの実行結果がAならば expect(/A/) {|match| command2 } そうではなくBならば expect(/B/) {|match| command3 } end ぜひよろしくお願いいたします。
- リダイレクトでPOSTリクエストを復元する方法
【行いたいこと】 RailsでRESTフルなリソースを扱うアプリを開発しています。 アプリはユーザ認証機能を備えており、 RESTフルなリソースの操作(作成や削除など)はログインしたユーザだけが行えます。 ログインしていないユーザがこれらの操作をおこなうリクエストを送ってきた場合には、 認証ページに遷移させ、ユーザがログインした直後に、 ユーザ操作なしで当初のアクセスに対する操作処理を行いたいです。 【もくろみ】 ログインしたユーザだけが行える操作へのアクセスは、 フィルタ(before_filter)を使いインターセプトし、 ログインしていないユーザの場合には認証ページにリダイレクトします。 インターセプタ時点でリクエスト情報をセッションに格納しておき、 ログイン後にセッションからリクエスト情報を取り出し、 その情報を使ってリダイレクトすれば良いと考えました。 【問題点】 GETリクエスト(GETメソッドでのHttpリクエスト)をインターセプタした場合は上手くいきましたが、 POSTリクエストではリクエストを復元できません。 GETメソッドのリクエストになってしまいます。 リダイレクト(redirect_to)はブラウザにGETリクエストしか要求できないためです。 何か解決策はありますでしょうか。 よろしくお願いします。
- Ruby/Tkの一部が動かない
いつもお世話になってます。 今回GUIアプリケーションを作りたくて、ActiveTcl→http://www.activestate.com/からバージョン8.5をインストールしました。 そしてプログラムを作って実行すると、一部の簡単なものは実行できるのですが、少し複雑なプログラムになると「Ruby interpreter(CUI)1.8.6[i386-mswin32]は動作を停止しました」というダイアログが出てきてしまいます。コマンドラインのほうには、alloc: invalid block:XXXXXX: ef ef 30 (Xの部分は何かの16進数) のような文字が現れてしまいます。 原因を本で調べてみるとこれはTkのヘッダファイルとライブラリファイルの整合性が取れていないとのことでした。対策として、同じヘッダファイルとライブラリファイルが用いられているか確認し、不整合があるならext/tcltklib/extconf.rbを編集しなさいと書かれています。(うまくいかないために何度かバージョンの違うActiveTclをインストールしてしまったのでこの原因が有力だと思ってます。) このext/tcltklib/extconf.rbがどこを探しても見当たりません。これを見つけたことによって解決されるかはわかりませんが。。 どうか助けてください。お願いします。 WindowsVista Ruby-1.8
- .sub(/.+/,"aaaaaaa#{$&}"の置換開始行がずれるのなぜでしょうか?
f = ["1111111111111","2222222222222","3333333333333",] f.each {|l| p l.sub(/^.+$/, "aaaaaaa#{$&}bbbbbb") p l p "" } を Ruby1.8.7(2008-08-11patchlevel72)[i386-mswin32] で実行すると下記のように .sub(・・・) での置換開始行がずれました。なぜでしょうか?教えてくださいお願いします。 "aaaaaaabbbbbb" "1111111111111" "" "aaaaaaa1111111111111bbbbbb" "2222222222222" "" "aaaaaaa2222222222222bbbbbb" "3333333333333" ""
- ベストアンサー
- Ruby
- 2009032609
- 回答数3
- 2次元Hashのkeyチェック方法
yamlで記述した設定ファイルを読み込んで、 設定値があれば、変数にセットし、 なければdefault値を使うプログラムを書いています。 こんな感じです。 [設定ファイル(yaml)] top_dir : linux : /home/user windows : C:/Documents [ruby] conf = YAML.load_file(filename) p conf #=> {"top_dir"=>{"linux"=>"/home/user", "windows"=>"C:/Documents"}} str = "/root" str = conf['top_dir']['linux'] unless conf['top_dir'].nil? or conf['top_dir']['linux'].nil? 最後の2次元Hashのキーをチェックして、変数にセットしている 部分ですが、もっと短く書けないでしょうか? 特にconfが3回も出てくるところに無駄を感じています。 ちなみに、Hashのキー'top_dir'と'linux'は yamlに記述があるかもしれないし、ないかもしれないという 前提でお願いします。 達人の方、ご教授お願いします。
- COMコンポーネントの構造の本質的理解ができない
プログラミングを始めて間もない初心者です。 windowsアプリケーションを制御対象として扱おうと、win32oleライブラリをrequireしてCOMコンポーネントを扱う方法をネット上で色々調べてみたのですがどうも腑に落ちない点・分からない点があるので質問します。 rubyリファレンスマニュアルからリンクされているサイト(http://jp.rubyist.net/magazine/?0003-Win32OLE)において、以下のような記述があります。 >COM ではインスタンスを生成するときに「COM コンポーネント」を指 >定するための ProgID を引数として WIN32OLE.new メソッドを実行し >ます。 COM コンポーネントとは、Windows に登録された、ある機能 >(たとえば、IE や MS Office の制御機能) を提供するためのもので >す。この「COM コンポーネント」を利用して作成したインスタンス を>「COM オブジェクト」とこの記事では呼んでいます。 COM オブジェク>トを作成した後は、その COM オブジェクトで定義されている「メソッ>ド」を実行することでそのコンポーネントが提供する機能を実現する >ことができます。 この文に従えば、作成したCOMオブジェクトを扱う方法を知るためにはCOMオブジェクトで定義されているメソッドを参照すれば良いこととなります。そこで自分もWIN32OLE.new("InternetExplorer.Application") によって得たCOMオブジェクトにWIN32OLE.ole_methodsを適用することでメソッドの一覧を取得しましたが、前述のサイトで紹介されているie.document.all.Item()というメソッドを探してみてもどこにも見つかりません。 これはどういうことなのかと思い、ネット上で色々とCOMとは何か、タイプライブラリとは何かなどを調べて見ましたが、いまだCOMの全体像の把握ができません。 たとえばrubyの場合、あるオブジェクトに対して使えるメソッドというのはそのオブジェクトが該当するクラスに於いて定義されているメソッド((1))及びkernelモジュールで定義されている組み込みメソッド((2))ですよね。 (初心者なのでこの理解にも間違いがあるかもしれませんがその場合はご指摘お願いします) このような考え方でいくとWIN32OLE.ole_methodsによって取得したメソッドの一覧は(1)にあたり、document.all.Item()というのは(2)にあたるのではないかという考えもできるかと思うのですが誰か正しい理解をご教授いただきたいです。 質問が長くなってしまいましたがie.document.all.Item()というメソッドがどこに定義されているのか、そういったメソッドの定義場所はCOMにおいてどのように見つけるのか、そこだけでもいいのでよろしくお願いします。
- リダイレクト後のURLにしたい
Ruby on Railsで controller内で、何か処理を行った後 redirect_to "http://どこかのサイト" とリダイレクトした場合に ブラウザのアドレス欄ではリダイレクト前のURLのままで 表示はリダイレクト先となってしまいます。 アドレス欄の方もリダイレクト先にしたいのですが、何か方法ありませんか?
- 【ruby】 『クラスの生成に失敗』を表現したい
『クラスの生成に失敗』を表現したいのです。 newの戻り値にnilやfalseを返せばよいと考え、 以下の様に書いてみました。(行頭は全角スペースです。) class Hoge def initialize(arg) return arg end end h = Hoge.new(false) STDERR.puts 'err' unless(h) errはputsされませんでした。(グーグルで調べるとinitializeのreturnは、返ってこないそうでした。) そこで以下の様に書きました。(行頭は全角スペースです。) class Hoge attr_reader :stat def initialize(arg) @stat = arg end end h = Hoge.new(false) STDERR.puts 'err' unless(h.stat) なんか、ものすごく我流になってる気がします。。。 アドバイスをお願いいたします。
- open-uriを用いた、ウェブ上から情報を獲得するプログラムについて、
プログラミングを始めて間もない初心者です。 2chの国内サッカー掲示板一覧(http://ex24.2ch.net/soccer/subback.html)から 「集え」「名古屋グランパスファン」との文字列で検索したリンクを開き、取得した名古屋グランパスのスレッドの内容を表示するプログラムを書こうと、 以下のようなコードを書きました。が、 test1-9.rb:32: syntax error, unexpected tIDENTIFIER, expecting keyword_endとの警告メッセージとともにエラーになってしまいます。 #-*- coding:sjis-*- require 'open-uri' require 'uri' class Searchgra def initialize open("http://ex24.2ch.net/soccer/subback.html"){|g| g.each_line{|title| tsu = "集え" sup = "グランパスファン" if /(<a href="(.*)\/l50">.*#{tsu}.*#{sup})/ =~ title then @grasre ="http://ex24.2ch.net/test/read.cgi/soccer/#{$2}" end } } end def fuku open("#{grasre}") {|f| linenum = 0 f.each_line {|line| line.gsub!(/>/,">") line.gsub!(/<br><br>/,"<br>\n") if /<dd>/ =~ line then linenum += 1 end /<dd>.*<br>\n/ =~ line print linenum,";","#{$&}".gsub!(/<.*?>/,"") print("\n") #ここが32行目 } } end end search1 = Searchgra.new() search1.fuku ネットで様々な情報を見てみましたが原因が分からず、 またエラーメッセージ中のtIDENTIFIERとはいったい何なのかも分かりません。 ソースコードの間違い等、指摘をよろしくお願いします。
- Rubyでの時刻計算に関して
お世話になります。標記の件でご質問なのですが、 現在時間 t1 = 08:25:10 通信時間 t2 = 10.2 (sec) 上記のような形式で値が与えられており、現在時間より通信時間分だけ 差し引き、通信開始時間を(**:**:**)の形で算出したいのですが、 良い手段がございますでしょうか。
- インスタンス変数の値の保持に関して
お世話になります。現在Rubyのプログラムを生成しております。 CSVを出力加工するプログラムで、処理の流れは以下のとおりです。 1) 処理対象となるCSVファイルより、値を1つずつ取り出す records = Array.new(1) test_field_1 = PARAMETER.new(records[1].to_s) test_field_2 = PARAMETER.new(records[2].to_s) ... ... 2) initializeメソッドへ渡し、インスタンス変数「@parameter」 へ上書きし渡す。 def initialize(p) @parameter = p end 3) 出力時に(オブジェクト名.メソッド名)にて、メソッド処理を 行う。 printf(test_field_1.TEST_FIELD_1) printf(test_field_2.TEST_FIELD_2) ... ... 概ねの処理は、これで解決できるのですが、一箇所だけ前パラメータ 値を保持させたまま、次のパラメータを処理させたいのです。 具体的に申し上げますと、 1) test_field_100 = PARAMETER.new(records[100].to_i) def TEST_FIELD_100 @parameter = @parameter / 100 end ⇒ ここの@parameterの値を保持したまま、次のメソッドの処理を 行いたいのです。 うまいプログラムの書き方があれば、ご教示頂ければ助かります。 よろしくお願いいたします。
- RubyのHTTP POSTについて
HTTP POSTについてお聞きしたいです。 http://ligin.weizmann.ac.il/~lpgerzon/mbs4/mbs.cgi のページに、自動で入力を投げて答えを返してもらうスクリプトを書きたいです。 dataに、Inputする文字列を&でつないで、 Net::HTTP.start('ligin.weizmann.ac.il', 80) {|http| response = http.post('/~lpgerzon/mbs4/mbs.cgi',data) puts response.body } という方法で実行してみたのですが、 帰ってくる出力が、上記のURIのソースのままになってしまいます。 GUIでクリックして入力した場合は、末尾がmbs3.cgiのページに移動するはずなのですが、 なぜか上手く入力を与えることができません。 説明が曖昧で申し訳ありません。 アドバイスなどだけでも構いませんので、 よろしくお願い致します。