通过 sinatra 中的 html 按钮调用 Ruby 方法
Calling a Ruby Method via a html button in sinatra
作为练习,我正在尝试使用 Sinatra 构建一个电子商务网站。我对如何实现 'Add to Cart' 按钮感到困惑。我的思考过程是:
- 用户点击'add to cart'
按钮'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
});
作为练习,我正在尝试使用 Sinatra 构建一个电子商务网站。我对如何实现 'Add to Cart' 按钮感到困惑。我的思考过程是:
- 用户点击'add to cart'
按钮'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
});