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

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

ただいまの
回答率

90.51%

  • Ruby

    7699questions

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

  • Ruby on Rails 4

    2440questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 404

AkiraKan

score 4

お早うございます。
現在、初めてルビ言語で開発している僕には問題があってどっちらの方がこういう問題が解決方法などが分かれば教えて頂けませんか?
問題としてはエラーメッセンジ表示に関することです。
詳しくは:一つビューで二つのモデルのエラーを表示したいです。
例えば:
ビュー: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={:時給=>["を入力してください。"], :日付=>["を入力してください。"]}>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

+1

解決方法を見つけました。
ビューでエラーを表示するときに修正して出来ました。
原因:こっちらで【@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/19 00:21

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

    キャンセル

  • 2017/02/21 11:46

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/16 15:38

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

    キャンセル

  • 2017/02/16 16:21

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

    キャンセル

  • 2017/02/16 16:47

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

    キャンセル

  • 2017/02/16 16:50

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

    キャンセル

  • 2017/02/16 17:17

    renderを使用してedit指定しているのにeditに遷移せずエラーメッセージがでるので、editでエラーメッセージを表示するにはどうすればいいか、という理解でよろしいでしょうか。。

    ちなみに"ERRORS ======================>"は出力されていますか?

    キャンセル

  • 2017/02/16 17:22

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

    キャンセル

  • 2017/02/16 17:23

    pp とは PRETTY PRINT です。

    キャンセル

  • 2017/02/16 17:37

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

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7699questions

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

  • Ruby on Rails 4

    2440questions

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