我从其他人手中接过了一个项目,它在Ruby On Rails中,我知道非常小。基本上,有一个EXPORT按钮,用户单击该按钮可将数据发送到CSV。我的任务是将这些数据发送到视图以便在HTML中看到。 (以为我可以使用dataTables)。我尝试过以下示例,例如:
@example = StudentGroup.where(survey_id: @survey.id).order("groupNum")
然后在视图中使用<%= @example %>
只是为了查看数据而我什么都没得到。 (也是MySQL的新手)。如果任何人都可以帮助我,我会发布这个方法,我非常感激。
def download_results
if (user_signed_in?)
else
redirect_to new_user_session_path
end
@survey = Survey.find(params[:survey_to_view])
filename = @survey.name + " - " + Date.today.to_formatted_s(:short)
require "csv"
CSV.open(@survey.name+".csv", "wb") do |csv|
csv << [filename]
StudentGroup.where(survey_id: @survey.id).order("groupNum")
csv << []
csv << ["Summarized Results"]
csv << ["UCA","Group Number","Criteria 1","Criteria 2","Criteria 3","Criteria 4","Criteria 5","Criteria 6","Criteria 7","Criteria 8","Overall Team Contribution","Average(Would Work With Again)","Average(C1..C8)","Overall Team Contribution MINUS Average(C1..C9)"]
questions = @survey.questions
numQuestions = 0
questions.each do |q|
if(q.question_type != 2 && q.question_type != 4)
numQuestions = numQuestions+1
end
end
groups.each do |g|
answersCount = Answer.where(student_group_id: g.id).count
if(answersCount == numQuestions && answersCount != 0)
othersInGroup = StudentGroup.where(groupNum: g.groupNum, survey_id: @survey.id).order("groupNum")
size = othersInGroup.count-1
arr = []
criteria = SurveyQuestionDatum.where("number > 24 AND number < 35")
multiAvg = 0
teamCont = 0
criteria.each do |c|
avg = 0
othersInGroup.each do |o|
a = Answer.where(survey_question_datum_id: c.id, student_group_id: o.id).first
if(o.uca != g.uca)
if(a.nil?)
size = size-1
else
avg = avg + a.answer[g.uca].to_i
end
end
end
avg = avg.to_f/size
if(c.number == 33)
teamCont = avg
end
if(c.number < 33)
multiAvg = multiAvg+avg
end
arr << avg
end
multiAvg = multiAvg.to_f/8
arr << multiAvg
arr << teamCont-multiAvg
arr.insert(0,g.uca, g.groupNum)
csv << arr
end
end
csv << []
csv << []
csv << ["Raw Student Answers"]
groups = StudentGroup.where(survey_id: @survey.id).order("groupNum")
size = groups.count
csv << ["UCA", "F-Number", "Group Number"]
groups.each do |g|
answersCount = Answer.where(student_group_id: g.id).count
if(answersCount == numQuestions && answersCount != 0)
othersInGroup = StudentGroup.where(groupNum: g.groupNum, survey_id: @survey.id).order("groupNum")
csv << []
csv << [g.uca, g.FNum, g.groupNum]
answers = Answer.where(student_group_id: g.id)
csv << ["Question Number", "Question", "Answer"]
answers.each do |a|
datum = a.survey_question_datum
question = datum.question
#question_types = {"0" => "short", "1" => "paragraph",
#2" => "title", "3" => "fivept", "4" => "fixed",
#5" =>"ranking", "6"=>"tenpoints","7"=>"hundredpoints"}
ansText = ""
if(question.question_type == 0)
ansText = a.answer
elsif (question.question_type == 1)
if(question.rule == 'perMember')
othersInGroup.each do |o|
ansText = ansText+"#{o.uca},#{a.answer[o.uca]},"
end
elsif(question.rule == 'default')
ansText = a.answer
end
else (question.question_type == 3)
othersInGroup.each do |o|
ansText = ansText+"#{o.uca},#{a.answer[o.uca]},"
end
end
ansText = ansText.chomp(',')
ansText = ansText.split(',')
ansText.insert(0,datum.number,question.question_text)
csv << ansText
end
end
end
end
send_file(@survey.name+".csv", :filename => filename+".csv")
end
答案 0 :(得分:1)
您需要一个新的控制器操作。看看http://guides.rubyonrails.org/layouts_and_rendering.html
创建索引(或显示,或任何您想要调用它,可能是示例)操作。确保它在您的路线中 http://guides.rubyonrails.org/getting_started.html#adding-a-route-for-comments
不要使用download_results代码。
按照您尝试的方式设置@example变量。
为索引操作创建视图
将数据添加到索引视图中。
如果你把代码放在你的download_results方法(动作)中,它将永远不会因为send_file方法调用而被渲染。
您是否创建了全新的控制器/操作/视图?你用过发电机吗?您是否真的按照示例,视频,教程所说的方式练习此设置?如果你有,你已经看到所有的部分(模型,控制器,动作,视图)如何组合在一起。您应该已经看到了渲染语句如何发挥作用。这样做,正如教程所说的那样,你会得到这个想法。
如果要使用下载操作使用的相同内容,请重构代码以提取同时使用这两种操作的方法。
答案 1 :(得分:0)
这与respond_to
部分有关,请查看文档。
send_file(@survey.name+".csv", :filename => filename+".csv")
上面的代码只是意味着您单击按钮,控制器将使用csv文件回复您。所以,如果你想要一个html,控制器也应该能够响应html。