1

У меня есть следующий код в части Rails, который используется в некоторых почтовых программах, но я не доволен своим решением и чувствую, что это далеко не оптимально.Rails Partials - условность с местными жителями

У меня есть письмо, которое

С моей почтовой программы:

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, но в некоторых случаях конкретный партнер будет позвонить в наш API с дополнительными Params из [:guest_last_name] и [:guest_first_name], как определено выше. Это позволяет мне определить @contact_name в качестве отдельной переменной экземпляра.

Если это .present?, то я не хочу, чтобы я сделал @contact_name в поле по электронной почте, а не , которое вытащило бы из нашей БД.


В настоящее время в моем почтовом ящике используется следующий код для определения частичного его отображения.

<% 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 %> 

Есть ли лучший способ?

+2

Вместо того, чтобы помещать логику в представление, вы можете поместить ее в контроллер. Проверьте, предоставляются ли параметры и заданы ли локальные переменные для имени либо из 'user', либо из' params'. Затем просто выведите данные в виде. – Jon

ответ

1

Вы должны обязательно следовать совету @Jon относительно обращения с параметрами вашего контроллера/почтовой программы. Кроме того, вы должны просто передавать @contact_name каждый раз в базовое частичное, независимо от того, присутствует оно или нет, а затем проверять только, где вы хотите его отображать, если он присутствует. Таким образом, вы бы пропустить одну условную:

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

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

Следующим шагом может использовать специальный объект декоратора, который будет иметь дело с презентации logick. Он проверял бы, что имя_имодателя было предоставлено снаружи или из модели и отобразило желаемый тег 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 %> 

Однако если логика презентации не очень сложная, идя с парой условными и, возможно, извлекая их в основные рельсах хелперов в порядке и с помощью выступающего может быть избыточна

+0

Спасибо - это намного чище, чем решение, требующее 2 условных обозначения. –