Rails表单提交日期未传入控制器参数,始终使用默认值
问题排查与解决方案
核心原因
Rails的form_for会自动将表单参数嵌套在模型名对应的命名空间下,也就是params[:meal_plan],而非直接放在顶级params中。你直接取params[:start_date]自然拿不到用户提交的值,只会触发默认值逻辑。
修正控制器代码
调整参数获取方式,从params[:meal_plan]中提取日期值,同时处理参数为空的情况:
def new meal_plan_params = params[:meal_plan] || {} puts meal_plan_params[:start_date] puts meal_plan_params[:end_date] @meal_plan = current_user.meal_plans.build( start_date: meal_plan_params[:start_date].presence || Date.today, end_date: meal_plan_params[:end_date].presence || 6.days.from_now.to_date, ) @meal_plan.build_meals end
也可以用更安全的dig方法避免nil报错:
def new puts params.dig(:meal_plan, :start_date) puts params.dig(:meal_plan, :end_date) @meal_plan = current_user.meal_plans.build( start_date: params.dig(:meal_plan, :start_date).presence || Date.today, end_date: params.dig(:meal_plan, :end_date).presence || 6.days.from_now.to_date, ) @meal_plan.build_meals end
额外注意点
- 表单中的
form_group拼写错误,正确写法是form-group(连字符),虽然不影响参数传递,但会导致Bootstrap样式失效,建议修正。 - 常规流程中
new动作仅用于显示表单,提交表单应指向create动作(POST请求)。如果你的需求是在new中处理生成逻辑,当前GET请求方式可行,但需注意GET请求的参数长度限制。
内容的提问来源于stack exchange,提问作者sbyang19
相关产品推荐
相关产品推荐

