如何在Controller中显示数据库调用到视图中,以HTML格式查看

时间:2018-03-29 01:47:02

标签: ruby-on-rails ruby

我从其他人手中接过了一个项目,它在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

2 个答案:

答案 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。