如何将文本框值传递至Rails Controller?
解决Rails中文本框值传递到Controller方法的问题
嘿,作为Rails新手遇到这个问题太正常啦,咱们一步步拆解解决它~
首先得先理清两个核心问题:
- 你当前用的
link_to是独立的链接元素,它没法自动抓取表单里的文本框内容; - Rails的
link_to的method参数只支持标准HTTP方法(GET/POST/PUT/PATCH/DELETE),自定义的:test_user是不生效的,得先在路由里配置这个自定义动作。
下面给你两个可行的解决方案,按需选择:
方案一:改用表单提交按钮(推荐,更符合Rails规范)
这种方式最直接,把按钮整合到表单里,提交时自动携带所有表单字段值。
1. 先配置路由
在config/routes.rb里给user_creds资源添加自定义的test_user动作:
namespace :admin do resources :user_creds do member do post :test_user # 这里用POST还是GET,取决于你的业务需求 end end end
执行rails routes可以确认生成的路径是admin_user_cred_test_user_path。
2. 修改视图代码
把原来的独立link_to换成表单内的提交按钮,同时指定表单提交的目标路径:
<%= form_for [:admin, user_config], url: admin_user_cred_test_user_path(user_config), method: :post do |f| %> <!-- 这里是你的用户名文本框,假设字段名是username --> <%= f.text_field :username, class: "js-editable-text rf-table__td rf-table_..." %> <!-- 替换原来的link_to为表单提交按钮 --> <%= f.submit "My button", role: "button" %> <% end %>
3. 在Controller里获取值
你的Admin::UserCredsController里的test_user方法可以这样获取用户名:
def test_user username = params[:user_config][:username] # 接下来处理你的业务逻辑 end
方案二:保留link_to,用JavaScript传递值(适合必须用链接的场景)
如果因为UI需求必须用link_to,那得借助JS来抓取文本框的值,再拼接到请求里。
1. 配置路由(和方案一一致)
先在config/routes.rb里添加test_user动作。
2. 修改视图代码
给文本框加个ID方便JS获取,同时给link_to加个ID:
<%= form_for [:admin, user_config] do |f| %> <%= f.text_field :username, id: "username-input", class: "js-editable-text rf-table__td rf-table_..." %> <% end %> <%= link_to "My button", "#", id: "test-user-btn", role: "button" %>
3. 添加JavaScript代码
用原生JS(或jQuery)监听按钮点击,获取文本框值后发起请求:
// 原生JS版本 document.getElementById('test-user-btn').addEventListener('click', function(e) { e.preventDefault(); // 阻止链接默认跳转行为 const username = document.getElementById('username-input').value; const baseUrl = '<%= admin_user_cred_test_user_path(user_config) %>'; // 如果是GET请求,直接拼接参数跳转 window.location.href = `${baseUrl}?username=${encodeURIComponent(username)}`; // 如果是POST请求,需要动态创建表单提交(Rails需要authenticity_token) // const form = document.createElement('form'); // form.method = 'POST'; // form.action = baseUrl; // // // 添加用户名参数 // const usernameInput = document.createElement('input'); // usernameInput.type = 'hidden'; // usernameInput.name = 'username'; // usernameInput.value = username; // form.appendChild(usernameInput); // // // 添加Rails防CSRF的token // const tokenInput = document.createElement('input'); // tokenInput.type = 'hidden'; // tokenInput.name = 'authenticity_token'; // tokenInput.value = '<%= form_authenticity_token %>'; // form.appendChild(tokenInput); // // document.body.appendChild(form); // form.submit(); });
4. 在Controller里获取值
如果是GET请求,直接用params[:username]获取;如果是POST请求,同样用params[:username]。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

