[英]Rails Partials - conditionality with locals
我在某些郵件中使用了Rails部分中的以下代碼,但對我的解決方案不滿意,並且感覺這遠非最佳。
我有一封電子郵件
從我的郵件中:
def the_email_i_am_sending(user, inquiry, params = {})
get_variables(inquiry) #This also provides access to my `@user` object
@contact_name = [params[:guest_last_name].to_s, " ", params[:guest_first_name].to_s].join
我一直都有@user
但有時特定的合作伙伴會使用上面定義的[:guest_last_name]
和[:guest_first_name]
附加參數來調用我們的API。 這使我可以將@contact_name
定義為單獨的實例變量。
什么時候.present?
即不是零,我想在電子郵件上的字段中呈現@contact_name
而不是將從數據庫中提取的@user.login
。
然后,我的郵件程序視圖使用以下代碼來確定將呈現哪個部分。
<% if @contact_name.present? %>
<%= render 'meet_your_guest_v3', tujia_guest: @contact_name %>
<% else %>
<%= render 'meet_your_guest_v3' %>
<% end %>
然后,我的解決方案是在郵件程序中呈現的部分代碼中使用此代碼。 似乎有些冗長,但我不確定local_assigns.has_key?
的正確用法local_assigns.has_key?
<% if local_assigns.has_key?(:partner_guest) %>
<%= partner_guest %> <p>(via our partner</p>
<% else %>
<%= @user.login %>
<% end %>
有沒有更好的辦法?
您絕對應該遵循@Jon的建議來處理控制器/郵件程序中的參數。 另外,您應該每次都將@contact_name傳遞給基礎部分,而不管它是否存在,然后僅檢查要呈現它的位置(如果存在)。 這樣,您將跳過一個條件:
#email_view.html.erb
render 'meet_your_guest_v3', parnter_guest: @contact_name
_contact_name.html.erb
<% partner_guest.present? %>
...
進一步的步驟可以是使用特殊的裝飾器對象,該對象將處理表示邏輯。 它將檢查是否從外部或從模型中提供了contact_name,並呈現了contact_name所需的html標簽(或者它可以將其作為字符串返回)。 請參閱下面的使用偽裝寶石的偽代碼:
class MyController < ApplicationController
def send_mail
@user = User.find(...).decorate(
contact_name: [params[:guest_last_name].to_s, " ", params[:guest_first_name].to_s].join
)
MyMailer.the_email_i_am_sending(@user)
end
end
class MyMailer < ApplicationMailer
def the_email_i_am_sending(user)
@user = user
mail(to: ..., subject: ...)
end
end
class UserDecorator < Draper::Decorator
def contact_name_tag
if (contact_name.present?)
h.content_tag(:div, contact_name)
else
h.content_tag(:div, user_name)
end
end
end
#email_view.html.erb
<%= @user.contact_name_tag %>
但是,如果演示文稿邏輯不是很復雜,則使用幾個條件,也許將它們提取到基本的Rails助手中就可以了,而使用演示者可能會過頭
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.