【问题标题】:Why a ruby command runs even if a user don't activate the script yet?为什么即使用户还没有激活脚本,ruby 命令也会运行?
【发布时间】:2015-10-10 06:23:24
【问题描述】:

我是一名 Ruby 用户,正在尝试制作一个接收用户活动请求的 Web 服务。我做了一个按钮,其中的类是“btn-send-alert”。然后在html代码之后,我放了一个脚本函数。

<div class="page-title">
     <button class="btn-send-alert"  style="background-color: transparent;">Help Request</button>
     <p>Hello</p><br>
  </div>

........

<script>

    $(".btn-send-alert").click(function(){
      alert('hello!');
      <% Smalier.class_alert(@lesson,current_user).deliver_now %>
    });

</script>

问题是,即使在我单击此按钮之前,ruby 代码也会自行启动。

如果我单击此按钮,将不再发送电子邮件。

也许在某些时候,我认为我错了,但我找不到它在哪里。有没有办法让这个功能正常工作?

期待看到回复!

最好的

感谢 Rich,我现在能够编写一个运行良好的代码!下面的代码就是那个代码。

  <%= content_tag :div, class: "page-title" do %>
       <%= button_to "Help Request",  support_path, method: :get, remote: true, class:"btn btn-danger", params: { lesson_id: @lesson.id, user_id: current_user.id} %>
       <%= content_tag :i, "wow!" %>

////

默认支持

@lesson = Lesson.find_by(:id => params[:lesson_id])
current_user = User.find_by(:id => params[:user_id])

mailer.class_alert(@lesson,current_user).deliver_now

结束

以上代码运行良好!

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    我是 Ruby 用户

    欢迎使用 Rails!


    无状态

    首先,您需要了解 Rails 应用程序 - 通过运行 HTTP - 是 stateless,这意味着“状态”,例如 UserAccount 必须随着每个新的行动。

    简而言之,这意味着在您的系统上调用操作/命令必须通过 ajax 或其他形式的服务器连接来完成。

    许多原生开发者(原生应用是有状态的)不了解 Rails / Web 应用如何能够保留“状态”,从而在他们的代码中犯了一大堆错误。

    接收用户的活动请求

    即使您了解如何在 Rails 应用程序中设置身份验证,了解它是无状态的优点也很重要...例如,上面的行意味着您必须有一个用户 登录并在您发送请求之前进行身份验证。

    这构成了您问题的一部分(我稍后会解释)


    ERB

    其次,您遇到的另一个问题是ERB nature of Rails

    在我点击此按钮之前,ruby 代码会自行启动。

    发生这种情况是因为您在前端脚本中包含了纯 Ruby 代码。这意味着无论何时加载(触发)这些脚本,它们都会触发。

    这里的底线是你需要把这个脚本放在你的服务器上。否则它只会运行...


    修复

    1.再培训局

    <%= content_tag :div, class: "page-title" do %>
         <%= button_tag "Help Request", class:"btn-send-alert" %>
         <%= content_tag :p, "Hello %>
    <% end %>
    

    1 个月后你会感谢我的。

    Convention over Configuration 表示您尽可能多地使用Rails helpers。您不必对它做傻事,但您的代码越“传统”,未来开发人员改进它的效果就越好。

    • 另一个提示 - 仅使用 HTML 进行格式化;用于样式的 CSS。不要使用&lt;br&gt;,除非您实际上想要换行。

    • 另一个提示 - 永远不要使用内联样式 - Rails 有一个足够的 asset pipeline,您应该将所有 CSS 放入其中

    --

    2。阿贾克斯

    其次,您对Javascript的使用不正确。

    更具体地说,您正在前端视图中调用基于服务器的函数。为了进一步解释这一点,我将向您展示我在这里经常发布的著名 MVC 图像:

    这就是 Rails 的工作方式 (MVC - Model View Controller) - 这意味着无论何时处理您的应用程序,您都必须在用户和您的应用程序之间提供一个抽象层——浏览器

    就其本质而言,浏览器是无状态的 - 它存储您必须在服务器上进行身份验证的会话 cookie。不能在前端 HTML/JS 中调用“服务器”代码。

    这就是为什么您的 Ruby 代码在没有任何交互的情况下触发的原因,尽管我不确定它是如何在资产管道中触发的。

    如果您想让它正常工作,您需要创建一个 控制器操作 来调用邮件发送功能,您可以使用以下设置来执行此操作:

    #config/routes.rb
    get :support, to: "application#support", as: :support -> url.com/support
    
    #app/controllers/application_controller.rb
    class ApplicationController < ActionController::Base
       respond_to :js, only: :support
       def support
          Smalier.class_alert(@lesson.current_user).deliver_now
       end
    end
    
    #app/views/controller/view.html.erb
    <%= content_tag :div, class: "page-title" do %>
         <%= button_to "Help Request",  support_path, method: :get, class:"btn-send-alert" %>
         <%= content_tag :p, "Hello" %>
    <% end %>
    
    #app/views/application/support.js.erb
    alert ("Hello");
    

    【讨论】:

    • 谢谢丰富!。在这里,我现在有两个问题。一是,它说“模板丢失”。 [这是我看到此日志的地址localhost:3000/support?]。支持方法也有两个变量(@lesson,current_user)。在您的示例中如何获得两个输入(@lesson,current_user)? (:我确实想学习!
    【解决方案2】:

    嵌入在 ERB 中的每一个 ruby​​ 代码 sn-p 都在服务器上运行,以便组装一个有效的 HTML 或 Javascript 脚本供浏览器呈现。

    浏览器根本不懂 ruby​​ 脚本,他们能理解的只有 HTML 和 Javascript。

    在您的情况下(我假设您使用的是 rails,因为您使用 ruby-on-rails 标记了您的问题),当 rails 引擎正在组装 HTML 时会发送电子邮件。

    如果您希望在用户单击该按钮后发送电子邮件,正确的方法是:

    1. 在某个控制器中定义一个操作方法,给它一个 URL(即在 config/routes.rb 中添加一个路由),在该操作中发送电子邮件。

    2. 当点击页面上的按钮时,向该 URL 发送 AJAX 请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多