Ruby on rails 通过URL将参数传递给Rails中的控制器
Rails中存在一个问题,我已经在URL中创建了一些传递参数的路由Ruby on rails 通过URL将参数传递给Rails中的控制器,ruby-on-rails,exception,controller,parameter-passing,Ruby On Rails,Exception,Controller,Parameter Passing,Rails中存在一个问题,我已经在URL中创建了一些传递参数的路由 #routes.rb 根“日秀” 获取“/day/:date/:activity”=>“day#show” 获取“/day/:date”=>“day#index” 我制作控制器的日期如下 #day_controller.rb 类DayController“2015-03-01”} 所以通过这一切我有几个问题 我设置的路线对吗 我是否正确访问控制器中的参数 请给我任何反馈,我是Rails的新手,我很乐意学习如何改进我的结构。对于
#routes.rb
根“日秀”
获取“/day/:date/:activity”=>“day#show”
获取“/day/:date”=>“day#index”
我制作控制器的日期如下
#day_controller.rb
类DayController<应用程序控制器
def秀
如果(!params.has_key?(:date))
@日期=getCurrentDate()
其他的
@日期=拆分日期(参数(:日期))
结束
@天=天。其中(“年=?和月=?和日期=?”、@date[0]、@date[1]、@date[2])
if(参数有_键?(:类型))
@活动=getAllData(参数(:类型))
结束
结束
def索引
@日期=参数(:日期)
如果(@date[0]=“?”)
@天=天
其他(@date[1]=“?”)
@天=天。其中(“年=?”,@date[0])
其他(@date[2]=“?”)
@天=天。其中(“年=?和月=?”、@date[0]、@date[1])
结束
结束
私有的
def getCurrentDate
日期=DateTime.now.to_
dateArrayOne=date.split('T')
dateArrayTwo=dateArrayOne[0]。拆分('-'))
结束
def拆分日期(日期)
finaldate=日期。拆分('-'))
结束
def getAllData(类型)
dataHash={}
案例类型
当“卡路里”
@每天,每天|
dataHash[:day.date]=day.carries
结束
当“步骤”
@每天,每天|
dataHash[:day.date]=day.steps
结束
当“活动分钟”
@每天,每天|
dataHash[:day.date]=day.activeMinutes
结束
当“距离”
@每天,每天|
dataHash[:day.date]=day.distance
结束
其他的
@每天,每天|
dataHash[:day.date]=day.carries
dataHash[:day.date]=day.steps
dataHash[:day.date]=day.activeMinutes
dataHash[:day.date]=day.distance
结束
结束
数据散列
结束
结束
因此,每当我输入任何带有日期或活动参数的URL(根很好,因为它只获取当前日期),我都会得到错误:
DayController#索引中的ArgumentError:参数数目错误(1个用于
0)在app/controllers/day_controller.rb:15:in'index'
正在传递参数,如异常页面中所示,该页面列出了:请求参数:{“日期”=>“2015-03-01”}
所以通过这一切我有几个问题
请给我任何反馈,我是Rails的新手,我很乐意学习如何改进我的结构。对于混乱的代码,我也很抱歉,我没有太多时间进行重构或评论。如果您使用的是Rails 4,您将需要: 然后,您可以执行以下操作:
def index
if params[:date]
@date = params[:date]
if(@date[0] == "?")
@days = Day.all
elseif(@date[1] == "?")
@days = Day.where("year = ?",@date[0])
elseif(@date[2] == "?")
@days = Day.where("year = ? AND month = ?",@date[0],@date[1])
end
end
end
我不确定它是如何复制粘贴的,但请考虑使用。 您应该使用
params[:date]
而不是params(:date)
。它的行为类似于散列,而不是函数
Patrick的解决方案几乎是正确的,但具有误导性,因为他没有正确使用强参数。POST数据需要强参数,但GET请求中的URL参数不需要强参数
如果它是一个处理POST数据的操作,json输入格式如下:
def index
if day_params[:date] //not params[:date], which would raise an error
@date = day_params[:date]
if(@date[0] == "?")
@days = Day.all
elseif(@date[1] == "?")
@days = Day.where("year = ?",@date[0])
elseif(@date[2] == "?")
@days = Day.where("year = ? AND month = ?",@date[0],@date[1])
end
end
end
private
def day_params
params.require(:day).permit(:date, :activity)
end
{“日期”:{“日期”:[2015,3,15],“活动”:“运行”}
然后您将使用强参数params.require(:day)
将授予对内部哈希的访问权,因此params.require(:day).permit(:date,:activity)
将授予对值的访问权。您可以这样使用它:
def index
if day_params[:date] //not params[:date], which would raise an error
@date = day_params[:date]
if(@date[0] == "?")
@days = Day.all
elseif(@date[1] == "?")
@days = Day.where("year = ?",@date[0])
elseif(@date[2] == "?")
@days = Day.where("year = ? AND month = ?",@date[0],@date[1])
end
end
end
private
def day_params
params.require(:day).permit(:date, :activity)
end
作为一个完全独立的问题,
dataHash[:day.date]
将不起作用。这将调用符号:day
上的date
方法,该符号不存在。您可能想使用dataHash[:day].date
是否使用强参数?你们允许日期了吗?下次,请突出显示你们所指的代码块的哪一行。错误在参数(:date)
内。它应该是params[:date]
。这里不需要强参数,因为您没有对ActiveRecord使用mass assignment,您还手动处理date参数定义和不使用day_参数的可能重复;不是错误的原因;另见上文评论