【问题标题】:Calling a Ruby Method via a html button in sinatra通过 sinatra 中的 html 按钮调用 Ruby 方法
【发布时间】:2016-05-20 07:12:36
【问题描述】:

作为练习,我正在尝试使用 Sinatra 构建一个电子商务网站。我对如何实现“添加到购物车”按钮感到困惑。我的思考过程是:

  1. 用户点击“加入购物车”
  2. “添加到购物车”按钮调用 ruby​​ 方法,例如单击以下按钮

    <input class='btn btn-primary' type='button' value='Add To Cart'></input>
    

应该调用像

这样的 ruby​​ 方法
shop.add_to_cart(product, quantity) 

此方法的外观示例:

    class Shop
      attr_reader :cart

      def initialize
        @cart = []
      end

      def add_to_cart(product, quantity)
        @cart << product, quantity
      end
    end

在 Rails 中,我认为我们在控制器中使用了 helper_method?我可以在 Sinatra 中做任何类似的事情吗?

谢谢!

【问题讨论】:

    标签: ruby sinatra


    【解决方案1】:

    注意:

    如果您想在 ruby​​ 中执行此操作。如另一个答案中所述,您可能也可以在 javascript 中执行此操作,但我无法为您提供帮助,因为我不太了解 javascript。


    要在按钮单击上运行 ruby​​ 方法,您首先需要创建一个只有按钮的&lt;form&gt;,然后在您的应用文件中运行一个路由,该路由将运行该方法,然后重定向回您所在的页面。这是我的代码(尚未测试):

    home.erb:

    <form method="post" action="/runMethod">
        <input type="hidden" name="product" value="whatever">
        <input type="hidden" name="quantity" value="whatever">
        <input class='btn btn-primary' type='submit' value='Add To Cart'>
    </form>
    

    您可以根据名称将两个隐藏输入(我写“whatever”)的值设置为数量和产品。

    应用文件:

    class Shop
      attr_reader :cart
    
      def initialize
        @cart = []
      end
    
      def add_to_cart(product, quantity)
        @cart << product, quantity
      end
    end
    get '/' do
        erb :home
    end
    post '/runMethod' do
        shop.add_to_cart(params[:product], params[:quantity])
        redirect '/'
    end
    

    【讨论】:

    • 谢谢!这正是我最终做的:)
    【解决方案2】:

    这也可以用ajax来完成,这样你就不用离开页面了:

        $("#hideCarousel").submit(function() {
          //posts the contents of the form to /action using ajax
          $.post("/action", $("#myform").serialize(), function(result){
            // assuming result is a string of the updated data in html
            // and assuming that your data goes in an element with the id data-table
            $("#data-table").html(result)
          });
          return false; // prevents the form from submitting normally
        });
    

    【讨论】:

      【解决方案3】:

      Rails/Sinatra 在服务器端运行。如果你想直接在 Rails 中发生事情,你可能需要一个表单并回发数据。 现在人们使用 javascript,它是 javascript 以异步方式为这类事情制作回调。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-13
        • 1970-01-01
        • 2011-01-22
        • 2019-02-28
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        相关资源
        最近更新 更多