Ruby on Railsのエラー等について

このQ&Aのポイント
  • Ruby on Railsについての質問として、errorsというメソッドの正体やエラーメッセージの扱いについて説明してください。
  • また、Rubyにおける論理演算子についても説明してください。
  • 質問にお答えいただける方、よろしくお願いします。
回答を見る
  • ベストアンサー

Ruby on Railsのエラー等について

以前Javaを触っていたものですが、新しい業務で携わることになったRuby on Railsについて質問があります。 1.errorsについて ActiveRecordを継承したModelにerrorsというメソッド(プロパティ?)がありますが、この正体は何という名前のクラスでしょうか。 また、このerrorsにはaddおよびadd_to_baseというメソッドでエラーメッセージを加えることができますが、加えたエラーは蓄積されていくのでしょうか、もしくは上書きされていくのでしょうか? 例えば、 model.errors.add_to_base('エラーが発生しました') model.errors.add_to_base('エラーがでたよ') と続けて書いた場合、error_message_forで表示されるエラーは後者('エラーがでたよ')だけという動きが正しいのでしょうか?もしくは、両方とも表示されるのが正しいでしょうか? 2.論理演算子「&&」「||」について Javaの「&&」や「||」という演算子は、前の判定だけで結果が出たなら後の判定をパスして先へ進みます(例えば「A && B」でAがfalseなら、Bの判定をせずにfalseを返すといった具合)。これに対して「&」や「|」といった、前の判定がどのような結果であれ後の判定も強制的に行うという演算子が用意されています(「A & B」ならAがfalseでもBの判定も必ずするといった具合)。 Rubyにはこれに相当する演算子はないのでしょうか?「and」や「or」がありますが、どうも違うようなので。 もし詳しい方がいらっしゃれば、ご教授下さい。 よろしくお願いします。

  • Ruby
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

2だけ回答。 何故見つけられなかったのか不思議ですが、そのまんま、 & と | というメソッドがあります。 標準では TrueClass, FalseClass, NilClass, Fixnum, Bignum のクラスだけで定義されているようです。 (メソッドなので再定義したり他のクラスに定義したりも出来ますが) 一方、&& || and or はメソッドじゃなくて言語機能の演算子(ある意味制御構造)で、どんなクラスのオブジェクトに対してでも使えます。 and / or は、演算子優先度を除いては && || と同じ機能です。優先度がどちらも最低なので、あまり良い例じゃないですが、 if x=gets and x.to_i>0 のように使います。&& だと、代入より優先度が高いので、代入の所にカッコが必要です。

outerlet
質問者

お礼

ありがとうございます。自分なりに調べたり実験したつもりだったのですが、なぜかうまくいかず(少なくともそう思い込んでしまったので)質問した次第です。 改めて分かりやすい例を作ってみて、回答頂いた通りの結果を得ることができました。No.1様には簡単な質問なのに丁寧にお答え頂いたこと、改めてお礼申し上げます。 回答者様おふたりともに感謝しきりなのですが、先にお答え頂いたということでNo.1様の回答をベストアンサーとさせて頂きます。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

ググルとすぐ1の回答も。 http://ar.rubyonrails.org/classes/ActiveRecord/Errors.html ActiveRecord::Errors クラスのメソッドですね(そもそもRubyにはプロパティはありません)。 add_to_base や そこから呼び出している add のソースも上記ページに書いてあります。 addするたびにArrayに蓄積していくようですね。

outerlet
質問者

お礼

Rubyにプロパティはないのですね。勉強になります。 2の回答といい自分なりに調べたつもりではいたのですが、簡単に見つかるものなのですね。それなのに親切に答えて頂いて、恐縮です。ありがとうございました。

関連するQ&A

  • Ruby on Rails: メソッドの定義で「self.」をつけるケースについて

    メソッドの名前に「self.」をつけるケースというは、 どういうことがあてはまるのでしょうか. 具体的には、以下のようなname_displayメソッドを作ったのですが、 「self.」をつけないと、undifined methodエラーになってしまいます. 偶然、self.をつけたら動いたので、そういうものかとわかりました. ただ、理由がわかりません. ご存知の方、お教えください. Userモデル id,username class User < ActiveRecord::Base def self.name_display(userid) begin @username = User.find(userid) return @username.username rescue return '削除ユーザ' end end end

  • ruby on railsの シンタックスエラー

    ruby on rails の初心者です。 rubyのバージョンは、ruby 2.0.0p451 (2014-02-24 revision 45167)です。 http://www.rubylife.jp/rails/ini/index4.html の初心者向けの記事を読みながら、コントローラーとアクションの設定の勉強をしていたのですが、 終盤どうしてもrails sでサーバーを起動すると、 /Library/Ruby/Gems/2.0.0/gems/actionpack-4.1.1/lib/action_dispatch/routing/mapper.rb:196:in `normalize_conditions!': You should not use the `match` method in your router without specifying an HTTP method. (RuntimeError) If you want to expose your action to both GET and POST, add `via: [:get, :post]` option. If you want to expose your action to GET, use `get` in the router: Instead of: match "controller#action" Do: get "controller#action” という表示がでてきてしまい起動できません。 matchをgetなどにかえて対処使用としても無理でした(sintax errolorがでます)。 どうしてでしょうか。どなたか教えて頂けると幸いでございます。

  • Ruby on railsのプログラムについて

    アップロード機能をつけたい場合どのように変更すればいいのでしょうか? アップロード機能の場所のみを書きますと まずテーブルにて Image_url varchar(200) not null 次に >ruby script/generate scaffold Product Admin でscaffoldを作成しました。 Productモデルの内容は 「class Item < ActiveRecord::Base validates_presence_of :title, :descritption, :image_url validates_numericality_of :price validates_format_of :image_url, :with => %r{^http:.+\.(gif|jpg|png)$}i, :message => "はGIF、JPG、PNG画像のURLでなければなりません"」 上のプログラムでは手でアドレス入力することになってしまいます。 これをフォルダの参照から デスクトップ マイドキュメント マイコンピュータ ~ ~ の様にする場合どこを書き換えればいいのでしょうか?

  • Ruby on Railsでデータベースに接続できない。

    Ruby on Railsでデータベースに接続できない。 『RailsによるアジャイルWebアプリケーション開発(第3版)』 http://www.amazon.co.jp/Rails%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%ABWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-Sam-Ruby/dp/4274067858/ref=sr_1_1?ie=UTF8&s=books&qid=1279209371&sr=8-1 という本でRuby on Railsの勉強をしています。現在、「第10章チェックアウト」の136ページあたりで行き詰っています。 ActiveRecord::AssociationTypeMismatch in StoreController#save_orderのメッセージが表示されていますが、どうやらデータベースに接続できていないようです。 configのdatabase.yml等を色々試行錯誤してみたり、色々ググってみたりしましたが、解決できませんでした。 どうやったらデータベースに接続できるのでしょうか。恐らくInstantRails-2.0に予め入っているMySQLやApacheと別々に入れたMySQLやApacheと競合しているからでしょうか。InstantRails-2.0の入っているMySQLやApacheは停止しています。 また、別々に入れたMySQLの方にはマイグレーション(?)で問題なくデータベースやテーブルが作成されています。なのにデータベースに接続できていないようです。 もう一つ、Ruby on Railsについて文字コードはcontrollers,helpers,models,views等に入っているファイルは全てutf-8にしなければならないでしょうか。何かWindowsでRuby on railsを開発するとコマンドプロンプトの関係でShift-JISに依存しているような気がします。

    • ベストアンサー
    • Ruby
  • Ruby on Rails 「attr_accessor」 の使い方に

    Ruby on Rails 「attr_accessor」 の使い方について こんにちは。 現在、Ruby on Railsで登録画面を作成しているのですが、attr_accessorで定義した項目に対して、validationのチェックを行うと、問題が起きてしまいました。 attr_accessorで定義した項目は、DB登録の対象ではないのですが、lengthのチェック等を行う必要があり、validates_length_of等を使って入力チェックを行っています。 問題になったのは、入力があったときだけチェックをかけたいのに、入力がなくてもチェックがかかってしまうという状態になってしまうことです。 「:if => 項目?」を書いてみると、「undefined method」のエラーがでてしまいます。 どなたか対応策の分かる方がおられましたらご教授いただけないでしょうか? 下記に実際の問題箇所のモデルクラスのソースを書いておきます。  class User < ActiveRecord::Base    attr_accessor :NEW_USER_PW ← 追加したアクセサ    # 追加したアクセサに対するチェック    validates_length_of :NEW_USER_PW, :minimum=>4, :message=>"は%d桁以上を設定してくださ                 い。", :on => :update, :if => :NEW_USER_PW?  end 上記のチェック内の「:if => :NEW_USER_PW?」で落ちてしまいます。 入力がないのにチェックに引っかかるとまずいので、入力がないときだけ上記チェックを行えれば良いのですが・・・。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • Ruby
  • ruby on railsにおけるモデルの関連付け

    ruby on rails のアソシエーションについて。 ruby on railsにおける、リレーショナルデータベースの作成についての質問です。 現在、 name,yomi,commentのカラムを持つnamesテーブル name1,name2,groupname,commentのカラムを持つgroupsテーブルをscaffoldにて作成しております。 この2つのテーブルを関連付けをしたいと考えています。 具体的には、 name1とname2を、それぞれnamesテーブルの中のnameを参照して使用したいと考えています。 各モデルのプログラムは以下のようになっています。 name.rb class Name < ActiveRecord::Base has_many :group attr_accessible :name :yomi :comment end group.rb class Group < ActiveRecord::Base attr_accessible :name1, :name2, :groupname, :comment end おそらく、groupテーブルに、name_idというカラムを追加し、nameテーブルにはhas_many :groups を追加する。といった形で良いかと考えていましたが、うまくいきません。 どのような形で実装すればよいか教えていただけないでしょうか。 また、もう1点、現在groupテーブルをweb上から登録する機能を作っています。 仕様としては、入力したname1,name2がすべてnamesテーブルのnameに含まれていれば、 name1,name2,groupname,commentすべてを登録、 いずれかあるいは両方が含まれていなければ、nameの登録画面へリンク、 となります。 現在実装中のプログラムのコントローラー部分(一部)は以下のようになります。 def create tag = params[:tag] @groups = Group.new もし、name1 name2 がnam2に含まれているならば、 @groups.name1 = tag[0] @groups.name2 = tag[1] @groups.groupname = tag[2] @groups.comment = tag[3] そうでなければ、 redirect_to name 登録画面 このような形で考えています。 こちらも、どのように実装すればよいか教えていただけないでしょうか? railsのバーションは3.1です。

  • Ruby on Railsのインストールについて

    Ruby on Railsのインストールをしています。 そこで、gemのインストールまではいきついたのですが、RMagickのインストールに失敗します。 失敗時のログは以下です。 --------------------------------------------------------------------------------- [manabix]# gem install rmagick --no-ri --no-rdoc -v 2.12.2 Building native extensions. This could take a while... /usr/local/lib/ruby/site_ruby/1.9.1/rubygems/ext/builder.rb:46: warning: Insecure world writable dir /usr/local in PATH, mode 040777 ERROR: Error installing rmagick: ERROR: Failed to build gem native extension. /usr/local/bin/ruby extconf.rb checking for Ruby version >= 1.8.5... yes checking for gcc... yes checking for Magick-config... yes checking for ImageMagick version >= 6.3.5... yes checking for HDRI disabled version of ImageMagick... yes checking for stdint.h... yes checking for sys/types.h... yes checking for wand/MagickWand.h... yes checking for InitializeMagick() in -lMagickCore... no checking for InitializeMagick() in -lMagick... no Can't install RMagick 2.12.2. Can't find the ImageMagick library or one of the dependent libraries. Check the mkmf.log file for more detailed information. *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --without-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=/usr/local/bin/ruby --with-MagickCorelib --without-MagickCorelib --with-Magicklib --without-Magicklib Gem files will remain installed in /usr/local/lib/ruby/gems/1.9.1/gems/rmagick-2.12.2 for inspection. Results logged to /usr/local/lib/ruby/gems/1.9.1/gems/rmagick-2.12.2/ext/RMagick/gem_make.out --------------------------------------------------------------------------------- どうすれば、うまくRMagickをインストールできますでしょうか?

  • RUBYのプログラムわかりません。

    昨日からRUBYを始めた初心者です。 BOX-COX変換を見て、コードを 動かそうとしましたが、NEW演算子?でエラーが 出たりして動きません。WINDOWS版ですがどのように すれば動くのでしょう。NEW演算子はクラス以外の 生成でどう使うのでしょう?下記NEW演算子の ところを抜き出しました。 どうぞよろしくお願い致します。 ar=[5.5,4.0,6.0,5.0,5.0,4.0,4.3] def Box_Cox1(ar, add)   ary=[1.2,2.0]   transformed_dn = ary.new() return ar.size end add = "0.01" begin p Box_Cox1(ar, add) end

  • ruby on rails チュートリアル

    チュートリアルの3章を勉強中なのですが(http://railstutorial.jp/chapters/static_pages?version=4.2#sec-generated_static_pages) リスト3-4で $ rails generate controller StaticPages home help このコマンドをしてから$ rails server -b $IP -p $PORTを入力すると => Booting WEBrick => Rails 4.2.4 application starting in development on http://0.0.0.0:8080 => Run `rails server -h` for more startup options => Ctrl-C to shutdown server [2015-11-11 09:39:15] INFO WEBrick 1.3.1 [2015-11-11 09:39:15] INFO ruby 2.2.1 (2015-02-26) [x86_64-linux] Exiting /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/socket.rb:206:in `bind': Address already in use - bind(2) for 0.0.0.0:8080 (Errno::EADDRINUSE) from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/socket.rb:206:in `listen' from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/socket.rb:461:in `block in tcp_server_sockets' from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/socket.rb:232:in `each' from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/socket.rb:232:in `foreach' from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/socket.rb:459:in `tcp_server_sockets' from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/utils.rb:70:in `create_listeners' from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/server.rb:133:in `listen' from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/server.rb:114:in `initialize' from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/httpserver.rb:45:in `initialize' from /usr/local/rvm/gems/ruby-2.2.1/gems/rack-1.6.4/lib/rack/handler/webrick.rb:31:in `new' from /usr/local/rvm/gems/ruby-2.2.1/gems/rack-1.6.4/lib/rack/handler/webrick.rb:31:in `run' from /usr/local/rvm/gems/ruby-2.2.1/gems/rack-1.6.4/lib/rack/server.rb:286:in `start' from /usr/local/rvm/gems/ruby-2.2.1/gems/railties-4.2.4/lib/rails/commands/server.rb:80:in `start' from /usr/local/rvm/gems/ruby-2.2.1/gems/railties-4.2.4/lib/rails/commands/commands_tasks.rb:80:in `block in server' from /usr/local/rvm/gems/ruby-2.2.1/gems/railties-4.2.4/lib/rails/commands/commands_tasks.rb:75:in `tap' from /usr/local/rvm/gems/ruby-2.2.1/gems/railties-4.2.4/lib/rails/commands/commands_tasks.rb:75:in `server' from /usr/local/rvm/gems/ruby-2.2.1/gems/railties-4.2.4/lib/rails/commands/commands_tasks.rb:39:in `run_command!' from /usr/local/rvm/gems/ruby-2.2.1/gems/railties-4.2.4/lib/rails/commands.rb:17:in `<top (required)>' from /home/ubuntu/workspace/sample_app/bin/rails:8:in `require' from /home/ubuntu/workspace/sample_app/bin/rails:8:in `<top (required)>' from /usr/local/rvm/gems/ruby-2.2.1/gems/spring-1.1.3/lib/spring/client/rails.rb:27:in `load' from /usr/local/rvm/gems/ruby-2.2.1/gems/spring-1.1.3/lib/spring/client/rails.rb:27:in `call' from /usr/local/rvm/gems/ruby-2.2.1/gems/spring-1.1.3/lib/spring/client/command.rb:7:in `call' from /usr/local/rvm/gems/ruby-2.2.1/gems/spring-1.1.3/lib/spring/client.rb:26:in `run' from /usr/local/rvm/gems/ruby-2.2.1/gems/spring-1.1.3/bin/spring:48:in `<top (required)>' from /usr/local/rvm/gems/ruby-2.2.1/gems/spring-1.1.3/lib/spring/binstub.rb:11:in `load' from /usr/local/rvm/gems/ruby-2.2.1/gems/spring-1.1.3/lib/spring/binstub.rb:11:in `<top (required)>' from /home/ubuntu/workspace/sample_app/bin/spring:13:in `require' from /home/ubuntu/workspace/sample_app/bin/spring:13:in `<top (required)>' from bin/rails:3:in `load' from bin/rails:3:in `<main>' となってしまいますがこれってエラーですよね? ビューも開けないのですが、どなたか教えていただきたいです もしかしたら上のコマンド関係ないのかもしれないです。 よろしくお願いします。

    • ベストアンサー
    • Ruby
  • 演算子 Ruby認定試験対策問題

    Ruby認定試験対策問題をやっていたら分からないところがあったので、 教えてください。 2.4.演算子 ■問題 次の各行を独立して実行した場合、エラーとなる行があった。エラーとなった行について正しく述べているのはどれか。 A: 1 << 1 B: 1 << 1.0 C: 1.0 << 1 D: 1.0 << 1.0 ■回答 正解は(1)「C行, D行がエラーとなった。」 ■解説 Float には、<< 演算子が定義されていません。また、Integer型に、<< 演算子の引数として、浮動小数点を渡しても、引数は自動的にInteger型に変換され、正しく処理されます。 とあるのですが、問題の意味、なぜ回答が(1)になるか、また、解説の「Integer型に、<< 演算子の引数として、浮動小数点を渡しても」がどの部分を指すのかが分かりません。 自分が調べた限りでは、 << はIntegerクラスのメソッド(シフト演算子)で、ビットを左にシフトするものということだけなのですが……。 この場合、問題の主旨は、例えば「Aだと、1 を 1 ビット左にシフトする」、「Bだと、1 を 1.0 ビット左にシフトする」、「Cだと、1.0 を 1 ビット左にシフトする」という意味なのでしょうか。 また、演算子の引数というのは、<<より右側を指すのでしょうか?

    • ベストアンサー
    • Ruby