使用link_to传递参数失败,请求排查Rails代码问题
问题排查方案
1. 确认路由结构
先检查config/routes.rb的配置:
- 如果订单路由是嵌套在奖励下的,正确写法应为:
resources :rewards do resources :orders, only: [:new, :create] end
此时生成的路由是new_reward_order_path,需要传入reward实例作为参数。
- 如果是非嵌套路由但需要接收
reward_id,可配置为:
resources :orders, only: [:new, :create]
后续在link_to中手动传递reward_id参数即可。
2. 检查Rewards控制器的index动作
确保RewardsController的index方法正确初始化奖励集合:
def index @rewards = Reward.all # 或根据业务逻辑做筛选 end
只有这样,视图才能遍历获取单个reward实例。
3. 修正视图中的link_to写法
在Rewards索引视图里,你应该是在遍历奖励的循环中添加Buy按钮,必须使用循环内的局部变量reward,而非未定义的全局变量@reward:
<% @rewards.each do |reward| %> <!-- 奖励信息展示代码 --> <!-- 嵌套路由写法 --> <%= link_to 'Buy', new_reward_order_path(reward) %> <!-- 非嵌套路由写法 --> <%= link_to 'Buy', new_order_path(reward_id: reward.id) %> <% end %>
4. 验证路由参数要求
在终端运行rails routes命令,查看订单路由的参数要求:
- 嵌套路由会显示类似格式:
new_reward_order GET /rewards/:reward_id/orders/new(.:format) orders#new
此时必须传入reward_id参数,直接传递reward实例Rails会自动提取id。
5. 完善Orders控制器的new动作
如果需要在订单页面使用奖励信息,确保OrdersController的new方法能正确获取奖励:
def new @reward = Reward.find(params[:reward_id]) @order = Order.new end
内容的提问来源于stack exchange,提问作者Wojtek
相关产品推荐
相关产品推荐

