質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

2回答

2411閲覧

RUBY ON RAILS:エラーオブジェクトを渡すためには、render でビューを呼ぶ方法

AkiraKan

総合スコア12

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

1クリップ

投稿2017/02/16 03:56

編集2017/02/16 08:35

お早うございます。
現在、初めてルビ言語で開発している僕には問題があってどっちらの方がこういう問題が解決方法などが分かれば教えて頂けませんか?
問題としてはエラーメッセンジ表示に関することです。
詳しくは:一つビューで二つのモデルのエラーを表示したいです。
例えば:
ビュー:Tester → こっちらに二つのモデルのエラーメッセンジが表示される
モデル:Tester、HourlyPay
コントローラ:Tester_controllerエラー発生後の画面

一つ気づいたのはRENDERの方が間違ってるはずだと思いますが。どうやってすれば【http://localhost:3000/testers/905773432/edit】に移動して
エラーを表示すろことが出来るのか迷っています。

コード:
ビュー:Tester

<%= form_for(@tester) do |f| %> <table class='ta1'> <%= pluralize(@tester.errors.count, "error") %> <%= pluralize(@tester.errors[:hourly_pay].count, "error") %> <% if @tester.errors.any? %> <tr id="error_explanation"> <th class="tamidashi" colspan="2"> <ul> <% @tester.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </th> </tr> <% end %> <% if @tester.errors[:hourly_pay].any? %> <tr id="error_explanation"> <th class="tamidashi" colspan="2"> <ul> <% @tester.errors[:hourly_pay].each do |message| %> <li><%= error %></li> <% end %> </ul> </th> </tr> <% end %> </table> <% end %>

モデル:
Tester

class Tester < ActiveRecord::Base include SearchHelper has_many :hourly_pay accepts_nested_attributes_for :hourly_pay ...... end

モデル:
HourlyPay

class HourlyPay < ActiveRecord::Base belongs_to :tester default_scope { order(:update_date) } validate :validate_amount validate :validate_before_insert_hourlypay def validate_amount if new_record? && amount.nil? errors.add("時給", "を入力してください。") end end def validate_before_insert_hourlypay if update_date.nil? errors.add("日付", "を入力してください。") else if new_record? && HourlyPay.where(update_date: update_date).size > 0 errors.add("日付", "が存在しています。") end end end end

コントローラ:
Tester_controller

def update respond_to do |format| if @tester.update(tester_params) format.html do if params[:update_password] str_array = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a password = ( Array.new(8){ str_array[rand(str_array.size)] } ).join @tester.password = password @tester.crypt_password @tester.save flash[:password]=password # redirect_to action: 'show' redirect_to action: 'show' and return # and return を書かないとエラーになる elsif params[:delete_hourly_pay] @user = HourlyPay.find(params[:tester][:hourlypay_id]).destroy redirect_to action: 'edit', id: params[:tester][:tester_id] elsif params[:new_hourly_pay] @update_date_hourlypay = params[:new_updatedate] @amount = params[:new_amout] @user_id = current_user[:user].id @hourlypay = HourlyPay.new(:tester_id => @tester.id, # :update_date => Date.parse(@update_date_hourlypay), :update_date => @update_date_hourlypay, :amount => @amount, :user_id => @user_id) @hourlypay.save end pp "ERRORS ======================>" pp @tester.errors pp @hourlypay.errors render :edit end format.json { render :show, status: :ok, location: @tester } else format.html { render :edit } format.json { render json: @tester.errors, status: :unprocessable_entity } end end end

コマンドで取得出来た情報:

#<ActiveModel::Errors:0x89dc7f8 @base= #<HourlyPay:0x8a74c88 id: nil, tester_id: "905773432", user_id: "118", update_date: nil, amount: nil, created_at: nil, updated_at: nil>, @messages={:時給=>["を入力してください。"], :日付=>["を入力してください。"]}>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

解決方法を見つけました。
ビューでエラーを表示するときに修正して出来ました。
原因:こっちらで**【@hourlypay】のOBJECTを確認しないといけない。
なぜかなると、ページをロードするときに
【@hourlypay】が作成されているけどきっとNILのOBJECTです。
なので【if @hourlypay && @hourlypay.errors.any?】と書かないとNILのエラーが発生されるはずと思います。
例えば:
【<% if @hourlypay.errors.any? %>】**これだけで書くとNILのエラーが発生

<% if @hourlypay && @hourlypay.errors.any? %> <tr id="error_explanation"> <th class="tamidashi" colspan="2"> <ul> <% @hourlypay.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </th> </tr> <% end %>

ご対応ありがとうございました。

投稿2017/02/17 04:36

AkiraKan

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tqkqt0

2017/02/18 15:21

解決してよかったです、お互いさらにスキルアップしましょう!
AkiraKan

2017/02/21 02:46

はい、アップしましょう! どうも、ありがとうございました。
guest

0

質問が少し理解できていないところがありますが、
単純にインスタンス変数のメッセージを出力したいのであれば、
flashなどを使えばどうでしょう。
http://railsdoc.com/references/flash

投稿2017/02/16 06:07

tqkqt0

総合スコア155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AkiraKan

2017/02/16 06:38

それも使ってみたんですが。もしかしてFlashで使えばサイトの構造が変わってしまうので今使わないんです。 ちょっと原因が分かっていてIFのCOMMANDの構造が複雑なので修正してやってみたいんです。 然し、TOPICにより解決方法があればよいと思います。
tqkqt0

2017/02/16 07:21

自給と日付のエラーメッセージがすでに2つでていますが、2つ出力したいとはどういうことでしょうか。もう少しわかりやすく書いていただければ回答しやすいかと思います。 よろしくお願いいたします。
AkiraKan

2017/02/16 07:47

あー、すみませんでした。 ビュー:Testerのところを見て頂けません? 時給と日付は未入力でバリデーションをしてエラーメッセンジ発生された後に【ビュー:Tester】のビューに移動してエラーメッセンジを表示することです。 これって分かりやすいかな。
AkiraKan

2017/02/16 07:50

すみませんが。ただいま、コントローラをアップデートをしました。
tqkqt0

2017/02/16 08:17

renderを使用してedit指定しているのにeditに遷移せずエラーメッセージがでるので、editでエラーメッセージを表示するにはどうすればいいか、という理解でよろしいでしょうか。。 ちなみに"ERRORS ======================>"は出力されていますか?
AkiraKan

2017/02/16 08:22

あー、pp "ERRORS ======================>" これってコマンドで表示されます。私の確認方法です。ww ちなみにコントローラを全て更新しました。 【という理解でよろしいでしょうか】はい、その通りです。
AkiraKan

2017/02/16 08:23

pp とは PRETTY PRINT です。
AkiraKan

2017/02/16 08:37

ちなみにコマンドで確認したのはオブジェクトにエラーメッセンジを詰め込んでいるんです。 【コマンドで取得出来た情報:】のところを参考して頂けないでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問