You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将文本框值传递至Rails Controller?

解决Rails中文本框值传递到Controller方法的问题

嘿,作为Rails新手遇到这个问题太正常啦,咱们一步步拆解解决它~

首先得先理清两个核心问题:

  1. 你当前用的link_to是独立的链接元素,它没法自动抓取表单里的文本框内容;
  2. 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

如果因为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:21:03