您好我有以下问题。我想调用一个控制器方法,通过按钮或链接的onklick选项执行一些sql语句。
所以我在控制器中有一个方法“发布”。看起来像这样:
def publish
do execute sql statements
flash[:notice] = 'sql statements executed.'
end
在我看来,我希望有一个按钮或链接来调用这个方法:
<input type="button" onclick="<% controller.publish %>">
但我收到错误:
未定义的局部变量或方法
我还尝试将其路由为使用此方法:action。这不起作用。我现在搜索了一段时间,并通过使这个方法成为helper_method找到了一些解决方案,尽管我再次得到了同样的错误。 我是Ruby和Rails的新手,所以我希望你能帮助我。
答案 0 :(得分:1)
如果在您看来,您尝试<% controller.publish %>
之类的内容,则会在呈现视图时调用publish
操作 ,而不是在用户点击按钮时
您可以这样做:
创建一条路线,在请求时调用publish
。例如,假设路线为/publish
。
在您看来,请输入以下内容:
<input type="button" onclick="window.location = '/publish'">
onclick
属性的值必须是有效的JavaScript,单击该按钮时将执行该JavaScript。在JS中,设置window.location
会导致浏览器导航到其他页面。在这种情况下,我们将浏览器导航到/publish
,这将导致您的publish
操作被调用。无论您在publish
呈现什么,都会出现在浏览器中。
在上面显示的publish
代码中,您的Ruby语法错误,但我假设它只是一个示例,而不是您正在使用的实际代码。
答案 1 :(得分:1)
您的ruby on rails代码是服务器端。
您视图中的代码,例如<input type="button" onclick="<% controller.publish %>">
是客户方。
您无法直接从客户端代码调用服务器端方法,因为客户端代码只是在用户的浏览器中运行。 我没有使用过RoR所以不知道详细信息,但是你必须从客户端代码向服务器提交一条消息,然后在服务器端你会想要接收它并从那里调用publish方法。 希望这会有所帮助。
答案 2 :(得分:1)
首先,如果您的SQL语句要更改任何数据(它看起来像是这样),那么使用POST请求而不是GET请求非常重要。要做到这一点,您需要使用基本表单提交而不是单击链接,或者在单击链接时使用javascript提交POST请求。让我们谈谈第二种方式,因为这将与您希望应用程序的外观保持一致。
假设jQuery,您可以使用jQuery.post方法在点击按钮时发布到publish
操作。在成功回调中,您可以显示有关已执行的sql语句的消息。
答案 3 :(得分:0)
@ alex-d的答案似乎已经足够了。只需使用button_to
,在publish
操作结束时,您可以重定向到同一页面(或者与之前相同的操作,如果您要加载要在视图中显示的记录)。
编辑:来自@ alex-d的回答:
创建一个在请求时调用发布的路由。例如,假设路线是/ publish。
GET '/publish' to: 'Controller#publish'
在您看来,请输入以下内容:
<input type="button" onclick="window.location = '/publish'">
现在在您的控制器方法上,重定向:
def publish
do execute sql statements
flash[:notice] = 'sql statements executed.'
redirect_to route_where_the_button_view_is_path #(or render if that controller method isnt necessary)
return #to avoid multiple render or redirect error (maybe not necessary)
end
PD:我的代码可能在第一次尝试时无效,我正在从内存中解决这个问题。
GL&amp; HF。