Rails嵌套路由下使用link_to传递参数及取值方法问询
解决嵌套路由下传递并获取ques_num参数的问题
嘿,你已经成功把参数传到URL里了,这步操作完全没问题!接下来咱们一步步搞定在控制器和视图里获取参数,以及把它存入@question.ques_num的事儿:
1. 在Questions控制器的new动作中获取参数并赋值
因为参数是通过URL的query string传递的,你可以用params[:ques_num]直接获取。不过要注意,URL里的参数默认是字符串类型,记得转成整数,同时做个存在性判断避免报错。代码示例:
def new # 先找到对应的Coin实例(嵌套路由必备) @coin = Coin.find(params[:coin_id]) # 初始化关联的Question @question = @coin.questions.new # 获取ques_num参数并赋值,不存在的话可以设个默认值(比如1) @question.ques_num = params[:ques_num].to_i if params[:ques_num].present? end
2. 在new视图中使用该参数
如果需要在页面上显示当前问题编号,直接调用@question.ques_num就可以了(当然也可以直接用params[:ques_num],但用模型属性更符合Rails的MVC逻辑)。比如:
<h4>Submit Answer for Question #<%= @question.ques_num %></h4>
3. 在create动作中确保参数被存入数据库
new动作只是初始化对象,真正保存数据是在create动作里,一定要把ques_num加入强参数列表,否则Rails会拦截这个参数,导致无法存入数据库。代码示例:
def create @coin = Coin.find(params[:coin_id]) @question = @coin.questions.new(question_params) if @question.save redirect_to @coin, notice: 'Question submitted successfully!' else render :new end end private def question_params # 把ques_num添加到允许的参数集合里,替换成你实际需要的其他字段 params.require(:question).permit(:ques_num, :content, :其他字段名) end
4. 可选:给参数加模型验证(更健壮)
为了确保ques_num只能是1-5的整数,你可以在Question模型里添加验证:
class Question < ApplicationRecord belongs_to :coin # 验证ques_num必须存在,且在1到5之间 validates :ques_num, presence: true, inclusion: { in: 1..5 } end
这样整套流程就完整啦,参数能正常传递、获取,最终也能存入数据库~
内容的提问来源于stack exchange,提问作者mattC
相关产品推荐
相关产品推荐

