Rails Partials - 与本地人的条件

时间:2016-02-01 07:45:45

标签: ruby-on-rails ruby-on-rails-4 partial-views actionmailer

我在一些邮件程序中使用了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?,即不是nil,我想在电子邮件中的字段中呈现@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?

的正确用法
<% if local_assigns.has_key?(:partner_guest) %>
  <%= partner_guest %> <p>(via our partner</p>
<% else %>
  <%= @user.login %>
<% end %>

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

你绝对应该遵循@Jon关于在控制器/邮件程序中处理params的建议。此外,您应该每次都将@contact_name传递给基础部分,无论它是否存在,然后仅检查您要呈现它的位置(如果存在)。这样你就可以跳过一个条件:

#email_view.html.erb
render 'meet_your_guest_v3', parnter_guest: @contact_name

_contact_name.html.erb
<% partner_guest.present? %>
...

进一步的步骤可能是使用一个特殊的装饰器对象,它将处理演示logick。它将检查从外部或从模型提供的contactname,并为contact_name呈现所需的html标记(或者它可以将其作为字符串返回)。请参阅以下使用draper gem的伪代码:

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帮助程序中就可以了,并且使用演示者可能是一种过度杀伤