自分のニーズに合ったソースをたくさん見つけることができなかったので、仲間のハッカーが切り刻んで少し良くするためにこれを投稿したいと思いました. このヘルパーの目標は、メッセージのリストまたは単一のメッセージの両方を渡すことができるようにすることでした。これにより、モデルに保存するときにアクティブなレコードの失敗をすべて追加したり、アプリケーションの任意の場所に一般的なメッセージを追加したりできました。また、複数のレイアウトにはrwz/nestiveを使用し、テンプレートにはSlim-langを使用しています。
列数を渡すことができるフラッシュ メッセージ パーシャルから始めましょう。
- if flash.present?
div[class="row"]
div[class="large-#{column_count} columns"]
= display_flash_messages(flash)
次のように呼び出すことができます:
= render partial: 'partials/flash_message', locals: { column_count: '12'}
ヘルパー コードは次のとおりです。メッセージの前に fontawesome アイコンも埋め込んでいることに注意してください。
module FlashHelper
DEFAULT_KEY_MATCHING = {
alert: {
type: 'alert',
i_class: 'fa fa-exclamation-triangle'
},
notice: {
type: 'success',
i_class: 'fa fa-check'
},
info: {
type: 'standard',
i_class: 'fa fa-check'
},
secondary: {
type: 'secondary',
i_class: 'fa fa-check'
},
success: {
type: 'success',
i_class: 'fa fa-ban'
},
error: {
type: 'alert',
i_class: 'fa fa-exclamation-triangle'
}
}
def display_flash_messages(flash)
html_output = ''
flash.each do |type, message|
key = DEFAULT_KEY_MATCHING[type.to_sym]
alert_wrapper_class = ('alert-box-multiple-wrapper' if message.is_a? Array) || 'alert-box-single-wrapper'
html_output +=
content_tag(:div, class: "alert-box #{key[:type]}", data: { alert: '' } ) do
if message.is_a? Array
html_output_nested =
content_tag(:ul, class: 'alert-box-list') do
message.to_a.map do |list_message|
content_tag(:li, list_message.humanize + '.', class: 'alert-box-li-item')
end.reduce(:<<)
end
else
html_output_nested = content_tag(:span, message.humanize + '.', class: 'alert-box-span-item')
end
html_output_nested = content_tag( :div, html_output_nested, class: "#{alert_wrapper_class}" )
html_output_nested = content_tag(:i, nil, class: "#{key[:i_class]}") + html_output_nested
html_output_nested += link_to('×'.html_safe, '#', class: 'close')
html_output_nested
end
end
raw(html_output)
end
end
関連する SASS:
div.alert-box {
.close {
color: $app-color-code-5;
@include opacity();
}
i {
font-size: 1.3em;
padding: 9px 6px 4px;
line-height: 0;
position: absolute;
top: 50%;
left: 0.5rem;
color: $app-color-code-5;
margin-top: -0.6875rem;
}
div.alert-box-single-wrapper {
margin-left: 25px;
.alert-box-span-item {
font-size: 1em;
}
}
div.alert-box-multiple-wrapper {
ul {
margin-left: 3.7rem;
list-style-type: disc;
margin-bottom: 0;
}
.alert-box-li-item {
font-size: 1em;
}
}
}
私のデバイス設定では、以下を使用できるようになりました。はい、デフォルトのデバイス構成を上書きします:
if resource_saved
....
else
# merge the ar errors together with devise
if resource.errors.messages.values.flatten.length > 0
flash[:error] = resource.errors.messages.values.flatten
end
# remove passwords from the view layer
clean_up_passwords resource
respond_with resource
end
最終的に、このセットアップは 2 つの異なる html のセットを構築します。
<div class="alert-box alert data-alert">
<i class="fa fa-exclamation-triangle"></i>
<div class="alert-box-multiple-wrapper">
<ul class="alert-box-list">
<li class="alert-box-item">The error message.</li>
</ul>
</div>
<a class="close" href="#">×</a>
</div>
<div class="alert-box alert data-alert">
<i class="fa fa-exclamation-triangle"></i>
<div class="alert-box-single-wrapper">
<span class="alert-box-span-item">The error message.</span>
</div>
<a class="close" href="#">×</a>
</div>
さて、これはすべて機能しますが、他の人がこの問題にどのように取り組んだのか疑問に思っています.