使用onclick选项在视图中调用控制器方法

时间:2014-01-28 13:36:50

标签: ruby-on-rails ruby

您好我有以下问题。我想调用一个控制器方法,通过按钮或链接的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的新手,所以我希望你能帮助我。

4 个答案:

答案 0 :(得分:1)

如果在您看来,您尝试<% controller.publish %>之类的内容,则会在呈现视图时调用publish操作 ,而不是在用户点击按钮时

您可以这样做:

  1. 创建一条路线,在请求时调用publish。例如,假设路线为/publish

  2. 在您看来,请输入以下内容:

  3. <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。