簡體   English   中英

Rails Partials-與當地人的條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM