Ruby on Rails表单:通过用户名下拉框关联用户ID问题
解决Rails关联表单下拉框显示用户名并传递ID的问题
你的问题主要出在两个细节上:视图生成选项的方法用错了,同时控制器可能没传递用户列表的实例变量。我来一步步帮你修复:
1. 修正视图中的下拉框代码
你用了@users.each { |c| [c.name, c.id] },但each方法返回的是原数组本身,不会生成你需要的[用户名, ID]键值对数组。应该换成map方法,它会返回处理后的新数组:
<div class="field"> <%= form.label :user_id %> <%= form.select :user_id, options_for_select(@users.map { |user| [user.name, user.id] }) %> </div>
或者更高效的写法,用pluck直接获取所需字段(推荐,减少不必要的对象实例化):
<div class="field"> <%= form.label :user_id %> <%= form.select :user_id, options_for_select(User.pluck(:name, :id)) %> </div>
2. 确保控制器传递用户列表
如果遵循MVC原则,不想在视图里直接调用User.all,需要在OrdersController的new和create动作中添加实例变量:
# app/controllers/orders_controller.rb def new @order = Order.new @users = User.all # 新增这行,将用户列表传递给视图 end def create @order = Order.new(order_params) @users = User.all # 创建失败重新渲染new页面时,也需要这个变量 respond_to do |format| if @order.save format.html { redirect_to @order, notice: 'Order was successfully created.' } format.json { render :show, status: :created, location: @order } else format.html { render :new, status: :unprocessable_entity } format.json { render json: @order.errors, status: :unprocessable_entity } end end end
3. 可选优化:设置默认选中项
如果想默认选中已存在的John用户,可以给options_for_select添加第二个参数:
<%= form.select :user_id, options_for_select(User.pluck(:name, :id), User.find_by(name: 'John').id) %>
这样页面加载时就会自动选中John的选项啦。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

