通过 sinatra 中的 html 按钮调用 Ruby 方法

Calling a Ruby Method via a html button in sinatra

作为练习,我正在尝试使用 Sinatra 构建一个电子商务网站。我对如何实现 'Add to Cart' 按钮感到困惑。我的思考过程是:

  1. 用户点击'add to cart'
  2. 按钮'add to cart'调用一个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 中做类似的事情吗?

谢谢!

Rails/Sinatra 运行 在服务器端。如果您想直接在 Rails 中发生事情,您可能需要一个表格和 post 返回数据。 现在人们使用 javascript 并且 javascript 以异步方式为这类事情进行回调。

注:

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


为了 运行 按钮单击上的 ruby 方法,您首先需要创建一个仅包含按钮的 <form>,然后在您的应用中为该 运行 路由文件将 运行 该方法然后重定向回您所在的页面。这是我的代码(尚未测试):

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

这也可以通过 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
    });