模型参数params返回nil时,如何为模型创建新的params?
解决模型Params返回Nil并创建新Params的方案
嘿,看起来你在做日期导航功能时碰到了模型参数返回nil的问题对吧?我帮你捋捋怎么创建并正确传递新的params,让你的日期切换功能正常跑起来。
先看你给的视图代码片段,里面用了link_to传递date: 'sub'参数,但大概率是控制器里没正确接收处理这个参数,才导致相关的模型参数(比如@dates)变成nil。下面是具体的解决步骤:
第一步:在控制器里接收并处理参数
首先得在对应的控制器(比如MoviesController)里,从请求的params里拿到日期相关的操作指令,然后生成正确的日期参数。举个例子:
# app/controllers/movies_controller.rb def index # 初始化日期:如果有传递date参数就调整,没有就默认今天 @dates = params[:date] ? adjust_date(@dates || Date.today, params[:date]) : Date.today # 把当前日期存在session里,保证切换日期是连续的,不会每次都跳回今天 session[:current_date] = @dates end private def adjust_date(current_date, action) # 根据传递的动作调整日期:sub是减一天,add是加一天 action == 'sub' ? current_date - 1.day : current_date + 1.day end
要是你想加个日期范围限制(比如不能早于一周前),可以在调整日期的方法里加判断:
def adjust_date(current_date, action) new_date = action == 'sub' ? current_date - 1.day : current_date + 1.day # 限制日期不能早于7天前 new_date >= Date.today - 7.days ? new_date : Date.today - 7.days end
第二步:修正视图里的链接参数传递
你原来的link_to写法有点问题,得把参数正确传到路径里,而不是直接把@dates当路径参数。修正后的写法应该是这样:
# 左边的减号箭头 - if @dates > Date.today - 7.days = link_to movies_path(date: 'sub'), class: 'arrow-btn' do %i.fa.fa-caret-left - else %i.fa.fa-caret-left.disabled # 给禁用的箭头加个样式
右边的加号箭头同理:
= link_to movies_path(date: 'add'), class: 'arrow-btn' do %i.fa.fa-caret-right
这样点击箭头时,date参数会被正确传到控制器,控制器就能计算出正确的@dates,不会再出现nil的情况。
第三步:让模型能正确使用参数
要是你的模型需要用这个日期参数做查询(比如筛选当天的电影),直接在控制器里把@dates传给模型就行:
# 在MoviesController的index方法里 @movies = Movie.where(show_date: @dates)
这样模型就能拿到有效的日期参数,不会出现nil的问题了。
小提示:处理参数默认值
为了避免意外情况,你可以给参数设置默认值,或者用强参数处理更复杂的参数场景(如果需要的话):
# 强参数示例(如果需要接收更多电影相关参数) def movie_params params.require(:movie).permit(:show_date, :title, :duration) end
不过你的场景主要是日期导航,前面的简单处理就足够啦。
内容的提问来源于stack exchange,提问作者Matthew Bins
相关产品推荐
相关产品推荐

