我正在尝试使用3列搜索我的模型。此外,如果列为空,则该列有效。这就是我这样做的方式
def getactivityfortoday
@temp = params[:temp]
logger.debug "params temp:#{@temp.inspect}"
@sky = params[:sky]
@day = params[:day]
@todaysactivities = []
@activities=[]
@finaldata = []
@activities = Weatherclockactivity.all
@attemptactivities = []
@attemptactivities = @user.attempts
for activity in @activities do
logger.debug "activity: #{activity.attributes.inspect}"
if @temp.to_i < activity.temperatureMax.to_i && @temp.to_i > activity.temperatuureMin.to_i
if @sky == activity.sky || activity.sky == ""
if @day == activity.day
@todaysactivities << activity
end
end
end
end
for activity in @todaysactivities
for attempt in @attemptactivities
if attempt == activity
finaldata << {activity: activity, attempt: "yes"}
else
finaldata << {activity: activity, attempt: "no"}
end
end
end
respond_to do |format|
format.html { render action: "new" }
format.json { render json: @finaldata }
end
我得到的响应是一个空数组,但我应该得到3行作为响应。
答案 0 :(得分:1)
拼写错误
activity.temperatuureMin.to_i
并且
finaldata << {activity: activity, attempt: "yes"}
应该是
@finaldata << {activity: activity, attempt: "yes"}
你也可以更简洁
def getactivityfortoday
@temp = params[:temp]
logger.debug "params temp:#{@temp.inspect}"
@sky = params[:sky]
@day = params[:day]
@activities = Weatherclockactivity.all
@attemptactivities = @user.attempts
@finaldata = @activities.map do |activity|
if (activity.temperatureMin.to_i + 1...activity.temperatureMax.to_i).include?(@temp.to_i) && ( @sky == activity.sky || activity.sky == "") && @day
@attemptactivities.include?(activity) ? {activity: activity, attempt: "yes"} : {activity: activity, attempt: "no"}
end
end.compact
respond_to do |format|
format.html { render action: "new" }
format.json { render json: @finaldata }
end
end
答案 1 :(得分:0)
这样的事情怎么样?
我试图在可读性和简洁性之间取得平衡。首先,我们过滤所需的活动。然后我们构造输出。这应该更容易调试。
def getactivityfortoday
@temp = params[:temp].to_i
@sky = params[:sky]
@day = params[:day]
@activities = Weatherclockactivity.all
@attemptactivities = @user.attempts
selected_activities = @activities.select do |activity|
# Make sure it's the right temperaure
return false unless (activity.temperatureMin.to_i + 1 ... activity.temperatureMax.to_i).include? @temp
# Make sure the sky matches, or the sky is blank
return false unless (@sky.blank? || @sky.activity == activity.sky)
# Make sure the day matches
return false unless @day == activity.day
# Otherwise, it's good!
return true
end
selected_attempted_activities = selected_activities.map do|activity|
ret = {activity: activity}
ret[:attempt] = @attemptactivities.include?(activity) ? "yes" : "no"
ret
end
respond_to do |format|
format.html { render action: "new" }
format.json { render json: selected_attempted_activities }
end
end
原作中有一些拼写错误(例如,@finaldata
不是最终数据)。确保正确拼写实例变量(以@开头的内容,如@sky
),因为如果您尝试访问未定义的实例变量,它将默认默认为nil。
答案 2 :(得分:0)
最好和最灵活的方法是使用ActiveModel::Model
它允许您使用更多有用的方法。
它似乎是:
应用程序/模型/ activity_report.rb
Class ActivityReport
include ActiveModel::Model
attr_accessor :day, :activity # and etc.
validates :day, presence: true
def day
@day.to_s # for example
end
def day=(value)
@day = value - 1.month # for example every date which user set will set on one month ago
end
# and etc
end
应用程序/控制器/ posts_controller.rb
...
def index
@activity = ActivityReport.new(params[:activity])
end
def create
@activity.create!
end
...
应用程序/视图/帖/ index.html.haml
= form_for @activity do |f|
= f.day
有关详细信息,请查看:
http://edgeapi.rubyonrails.org/classes/ActiveModel/Model.html
http://railscasts.com/episodes/219-active-model(旧)
http://railscasts.com/episodes/416-form-objects(更新,但有点复杂)