Rails-用于执行SQL存储过程的部分视图窗体



我有一个局部视图:

<%= form_with url: admin_command_path() do |f| %>
[form stuff]
<%= f.submit :onclick(?) button_to? link_to? %>
<% end %>

这个视图/表单不需要创建/更新引用的模型,而应该只执行我当前存储在ApplicationHelper AND中引用的^Command模块中的sql((,看看我可以从哪里调用它。一点意大利面,遇到墙的情况:/

def command_string(id)
execute = ActiveRecord::Base.connection.exec_query("
exec [dbo].[FunctionName] #{id}")
end

我已经尝试了几乎所有形式的动作,网址路由,等等都没有用。

理想的结果是,只需从表单的提交按钮或视图中的调用dang-sql函数,但该函数要么在加载时执行(而不是在单击时执行(,要么根本不执行。

Yall不会太在意缺少的params,用于粗略上下文的代码。只是在寻找一个onclick->sql exec路径转发。Thx

您认为这是完全错误的。

帮助程序是混合程序/垃圾抽屉,您可以在其中放置您打算在控制器和视图中重新显示的代码。它们不是直接从您的路线调用的;我希望当点击按钮时调用我的助手中的方法X";这不是一个很好的方法。

如果你想在用户点击链接/表单/按钮等时在服务器端发生一些事情,那就通过从客户端向服务器发送HTTP请求来完成。这可以是一个同步(正常(或异步(AJAX(请求。

通过创建一个与请求匹配的路由和一个发送响应的控制器操作,Rails可以对HTTP请求做出响应。

# routes.rb
post 'admin_command', as: :admin_command,
to: "admin#do_the_thing"
class AdminController < ApplicationController
def do_the_thing
# This code is vulnerable to a SQL injection attack if the 
# id originates from user! Use a parameterized query!
result = ActiveRecord::Base.connection.exec_query("
exec [dbo].[FunctionName] #{id}")
render text: "Okelidokeli duderino"
end
end
<%= form_with url: admin_command_path, local: true do |f| %>
<%= f.submit %>
<% end %>

即使不涉及模型或视图,Rails应用程序也遵循相同的基本结构。不要从功能的角度考虑问题,而是从Rails应用程序向客户端提供的API以及如何响应的角度考虑。

只有在以后,如果您需要重新生成跨控制器执行SQL查询的代码,或者在您的视图中,您才会在重构时将其放在助手中——它本身没有任何优点。

如果你想让这个异步(这样页面就不会重新加载(,你可以根据你的Rails版本使用Rails-UJS或Turbo来实现。或者,您可以从头开始,将事件处理程序附加到表单,并使用Fetch API发送ajax请求。

但您应该先弄清楚同步请求/响应周期的基本原理。

最新更新