お早うございます。
現在、初めてルビ言語で開発している僕には問題があってどっちらの方がこういう問題が解決方法などが分かれば教えて頂けませんか?
問題としてはエラーメッセンジ表示に関することです。
詳しくは:一つビューで二つのモデルのエラーを表示したいです。
例えば:
ビュー: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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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 %>
ご対応ありがとうございました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
質問が少し理解できていないところがありますが、
単純にインスタンス変数のメッセージを出力したいのであれば、
flashなどを使えばどうでしょう。
http://railsdoc.com/references/flash
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/02/19 00:21
2017/02/21 11:46
どうも、ありがとうございました。