【问题标题】:Rails using remote: true to control popupRails 使用 remote: true 来控制弹出窗口
【发布时间】:2018-07-26 11:03:59
【问题描述】:

假设我有一个由Student 模型定义的对象s。这个对象有很多属性,包括一个相关的scores 对象。在与s 相关的show 视图中,有一个按钮可以使用button_to 在新窗口中打开该学生的scores 视图:

<%= button_to t("s.show_scores"), show_scores_path(s: s.id), method: :get, 'data-popup' => true, form: {class: 'button-up'} -%>

现在,有一种情况是学生尚未获得所有分数,在这种情况下,我不希望打开 scores 视图。这是使用控制器中的条件完成的:检查@s.scores.valid?,如果是,则继续,否则不会显示scores 视图,而是打开一个弹出窗口,其中包含当前视图和我发出的警报消息:

def show_scores
    @s = Student.find(params[:student])
    @s.calc_response_scores_if_missing
    if(@s.scores.valid?)
        redirect_to students_path, flash: {alert: I18n.t("students.missing_obs")} and return
    end
    @format = "html"
    respond_to do |format|
      format.html
    end
  end

我想更进一步:我希望在单击按钮时检查@s.scores.valid? 条件。如果是肯定的,则继续在弹出窗口中打开视图,如果否定,我不希望打开弹出窗口并且警报出现在当前页面上(显然使用render 而不是redirect_to)。我认为这可以使用remote: true 来完成,但我不太确定如何。任何帮助都会很棒:)

【问题讨论】:

  • 是的,这可以通过使用ajax 来完成。此外,您可以在视图中添加条件if-else,当@s.scores.valid? 呈现button_to t("s.show_scores"), show_scores_path(s: s.id) ... 时,呈现具有相同名称的未链接按钮,并且仅在通过js 点击时显示您的消息。

标签: javascript ruby-on-rails ruby ajax helpers


【解决方案1】:

我认为您已经可以在第一次加载显示视图时执行此操作。根据条件,您呈现触发正确用户体验的按钮。所以在伪代码中:

show.html.erb

<%=
@s.scores.valid? ? "render button that opens popup" : "render button that does something else"
%>

【讨论】:

  • 这要求我将逻辑放在视图中,我尽量避免。我也喜欢这个按钮一直显示。
  • 它会一直显示,只是它触发的功能可能不同。你可以使用一个特殊的类,这样你就可以通过 JS 捕捉点击。此外,视图中的某些逻辑也没有错。你总是可以通过使用 ViewPresentor 或其他东西来重构它:nithinbekal.com/posts/rails-presenters
【解决方案2】:

不使用 ajax (remote: true) 的最简单方法是使用“分数无效”消息和关闭窗口的按钮呈现弹出窗口,或者仅使用 javascript 代码呈现空白页面以关闭窗口立即(Facebook 在他们的登录按钮上使用这种技术。)

<script>
  window.close();
</script>

我不推荐弹出方式,例如,您可以使用 ajax 重新渲染部分视图,或者打开 jQuery(或您正在使用的任何 js 库)弹出窗口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    相关资源
    最近更新 更多