【问题标题】:Rails Partials - conditionality with localsRails Partials - 当地人的条件
【发布时间】:2016-02-01 17:49:10
【问题描述】:

我在某些邮件程序中使用了 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?的正确用法

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

有没有更好的办法?

【问题讨论】:

  • 与其将逻辑放在视图中,不如将其放在控制器中。测试是否提供了参数,并从userparams 为名称设置一个局部变量。然后在视图中输出数据即可。

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


【解决方案1】:

您绝对应该遵循@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标签(或者它可以将其作为字符串返回)。请参阅以下使用 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 助手中就可以了,使用演示器可能是一种矫枉过正

【讨论】:

  • 谢谢 - 这比需要 2 个条件的解决方案干净得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多