Ruby on rails 如何在erb文件中呈现嵌套集合-ruby on rails

Ruby on rails 如何在erb文件中呈现嵌套集合-ruby on rails,ruby-on-rails,erb,has-many,Ruby On Rails,Erb,Has Many,我被困了两天 我的问题是: 我无法在.erb处打印嵌套集合对象的值 让我解释一下我的情况: 我有学生课和学科课 一个学生有许多科目 用例:我有一个搜索页面,我可以从中搜索(例如:按姓名)学生信息 输出:学生名单。(每个学生都有一份科目表) 问题:在视图部分,at.erb文件:-我可以打印学生姓名,但不能打印科目名称 这是我的文件片段 模型类: class student < ActiveRecord::Base has_many :subjects, :class_name=

我被困了两天

我的问题是: 我无法在.erb处打印嵌套集合对象的值

让我解释一下我的情况:

  • 我有学生课和学科课
  • 一个学生有许多科目
用例:我有一个搜索页面,我可以从中搜索(例如:按姓名)学生信息

输出:学生名单。(每个学生都有一份科目表)

问题:在视图部分,at.erb文件:-我可以打印学生姓名,但不能打印科目名称

这是我的文件片段

模型类:

class student < ActiveRecord::Base

    has_many :subjects, :class_name=>"subject"

    attr_accessible :first_name, :middle_name, :last_name, 

    self.table_name="students"
    set_primary_key :id

    blahblah
end

class subject < ActiveRecord::Base

    belongs_to :student, :foreign_key=>'student_id'

    attr_accessible :student_id, :name

    self.table_name="subjects"

    blahblah
end
class-student“主题”
属性可访问:名字,:中间名,:姓氏,
self.table_name=“学生”
设置主密钥:id
布拉布拉赫
结束
类主题'student\u id'
属性可访问:学生id,:名称
self.table_name=“主题”
布拉布拉赫
结束
控制器类:

class StudentController < ApplicationController

    require "student.rb"

    def populate
        @pos=0

        filter_query = ''
        if !params[:firstName].blank?
            filter_query +=" first_name='" + params[:firstName].to_s + "' and"
        end

        if filter_query !=''
            filter_query= filter_query[0..filter_query.length-4]
            @stuData= Student.find(:all, :conditions=>filter_query)
        end

    end
class StudentControllerfilter\u query)
结束
结束
populate.html.erb

div class="header">
    <div class="heading" style="float:left;width:900px;">    
        <% form_tag(:controller=>"student", :action=>"populate") do %>
            <table>
                <tr>
                    <td width="10"> <label> First Name:</label> </td>
                    <td width="40"> <%= text_field_tag('firstName') %> </td>
                </tr>
            </table>

            <input name="submitFormName" class="form_submit" type="submit" value="Search" />

        <% end %>

        <div height="10">&nbsp;</div>

    </div> 
</div>

<div class="students" style="float:left;width:1330px;">

    <% if !@stuData.blank? %>
        size = <%= @stuData.size %>
        <% if !@stuData.nil? %>
            <%= render :partial=>'populate' , :locals=>{:stuData => @stuData} %>
        <% end %>
    <% else %>
        <div>Not found...</div>
    <% end %>
</div>
<div style="overflow-y:auto;overflow-x:scroll;">              
    <table >
      <thead>
        <th>Id</th>
        <th>First Name</th>
        <th>Middle Name </th>
        <th>Last Name</th>
        <th>Subject Name</th>
      </thead>    
      <% stuData.each do |item| %>
      <tr>
        <td id="studentId"> <%= item.id %> </td>
        <td id="firstNameId"> <%= item.promotion_code %> </td>
        <td id="middleNameId"> &nbsp; </td>
        <td id="lastNameId"> &nbsp; </td>
        <td id="cityId">
          <% @var1 = item.Subject %>
          <% if @var1.nil? %>
            <% @var1.each do |pc| %>
              <%= pc.name %>
            <% end %>
          <% end %>
        </td>
      </tr>
    <% end %>
  </table>
</div>
div class=“header”>
“学生”,操作=>“填充”)do%>
名字:
尺寸=
'填充',:locals=>{:stuData=>@stuData}%>
找不到。。。
_populate.html.erb

div class="header">
    <div class="heading" style="float:left;width:900px;">    
        <% form_tag(:controller=>"student", :action=>"populate") do %>
            <table>
                <tr>
                    <td width="10"> <label> First Name:</label> </td>
                    <td width="40"> <%= text_field_tag('firstName') %> </td>
                </tr>
            </table>

            <input name="submitFormName" class="form_submit" type="submit" value="Search" />

        <% end %>

        <div height="10">&nbsp;</div>

    </div> 
</div>

<div class="students" style="float:left;width:1330px;">

    <% if !@stuData.blank? %>
        size = <%= @stuData.size %>
        <% if !@stuData.nil? %>
            <%= render :partial=>'populate' , :locals=>{:stuData => @stuData} %>
        <% end %>
    <% else %>
        <div>Not found...</div>
    <% end %>
</div>
<div style="overflow-y:auto;overflow-x:scroll;">              
    <table >
      <thead>
        <th>Id</th>
        <th>First Name</th>
        <th>Middle Name </th>
        <th>Last Name</th>
        <th>Subject Name</th>
      </thead>    
      <% stuData.each do |item| %>
      <tr>
        <td id="studentId"> <%= item.id %> </td>
        <td id="firstNameId"> <%= item.promotion_code %> </td>
        <td id="middleNameId"> &nbsp; </td>
        <td id="lastNameId"> &nbsp; </td>
        <td id="cityId">
          <% @var1 = item.Subject %>
          <% if @var1.nil? %>
            <% @var1.each do |pc| %>
              <%= pc.name %>
            <% end %>
          <% end %>
        </td>
      </tr>
    <% end %>
  </table>
</div>

身份证件
名字
中名
姓
主题名称
当响应包含“集合”,其中“集合的每个对象”包含另一个“集合”时,我不知道如何“呈现页面”

答复:学生名单 收藏品:学生 每个学生对象:包含集合(主题列表)

有人请帮忙

编辑

我尝试了以下方法来呈现集合。。。但不能取得成功

 - <%= render :partial=>'populate' , :locals=>{:stuData =>
   @stuData} %> 

 - <%= render :partial=>'populate' , :collection=>
   @stuData.subjects %>

 - <% render :partial=>'populate' , :collection=>
   @stuData.subjects %>

 - <%= render @stuData %>

 - <%= render :partial=>"populate", :collection=>@stuData,
   :as=>:item %>
-'populate',:locals=>{:stuData=>
@stuData}%>
-'填充',:集合=>
@stuData.subjects%>
-'填充',:集合=>
@stuData.subjects%>
- 
-“填充”,:collection=>@stuData,
:as=>:项目%>
第二次编辑

由于以下答案无法解决问题。。。。我与数据库和控制台进行了交叉检查。。。看起来还可以

@student = Student.find(144)
=> #<Student id: 4, first_name: "ABC", middle_name: "DEF", last_name: "GHI">
>> 
?> @isNullCheck = @student.Subject.nil?
=> false
>> 
?> @subList = @student.Subject
=> [#<Subject id: 5, student_id: 4, name: "Maths">, #<Subject id: 6, student_id: 4, name: "English"> ]
>> 
?> @StuSub1 = @student.Subject[0]
=> #<Subject id: 5, student_id: 4, name: "Maths">
>> 
?> @StuSub2 = @student.Subject[1]
=> #<Subject id: 6, student_id: 4, name: "English">
==
?> @StuSub3 = @student.Subject[2]
=> nil
>> 
>> @StuSubValue1 = @student.Subject[0].value
=> Maths
>> 
>> @StuSubValue2 = @student.Subject[0].value
=> English
>> 
@student=student.find(144)
=> #
>> 
?>@isNullCheck=@student.Subject.nil?
=>错误
>> 
?>@subList=@student.Subject
=> [#, # ]
>> 
?>@StuSub1=@student.Subject[0]
=> #
>> 
?>@StuSub2=@student.Subject[1]
=> #
==
?>@StuSub3=@student.Subject[2]
=>零
>> 
>>@StuSubValue1=@student.Subject[0]。值
=>数学
>> 
>>@StuSubValue2=@student.Subject[0]。值
=>英语
>> 
第三次编辑

至少有人能帮助我如何在erb中呈现页面。。。当响应具有对象数组时,其中每个对象本身都包含另一个集合。 (这里是一组学生。每个学生都包含一组科目。)


有人吗?

你应该可以这样做

stuData.each do |stud|
 stud.name
 bla bla bla...

 stud.subjects.each do |sub|
   sub.name
 end
end
相反,您没有使用您在模型中定义的关联

var1 = item.Subject
var1.each ....
编辑:正如你所说的,问题在于你要传递给你的分部的集合。作为“富啄” 建议你,你应该通过一些类似的考试:

<%unless @stuData.nil? %>
  <%= render :partial=>'populate', :stuData => @stuData %>
<%end%>

'填充',:stuData=>@stuData%>

型号

  • 需要是--
    班级学生
  • 需要简化:

  • 视图

    这将允许您显示以下内容:

    @stuData = Student.all
    
    <%= render partial: "populate", collection: @stuData, as: :stuData %>
    
    #_populate.html.erb
    <% stuData.each do |student| %>
        <%= "#{student.first_name} #{student.last_name}" %>
    
        <% student.subjects.each do |subject| %>
            <%= subject.name %>
        <% end %>
    <% end %>
    

    但我有个例外。。。“当你没有预料到它时,你有一个nil对象!你可能预料到数组的一个实例。计算nil时发生错误。app/views/student/_populate.html.erb的第23行中的每一行:”“第23行是行”“我已经交叉检查了表中的数据。。。看起来还可以。我已经编辑-第二次。。。关于我的交叉检查。如果您要返回数据,那么可能是您没有正确创建@stuData变量。正在为您更新答案“您有一个nil对象,但您没有预料到它!您可能期望数组的一个实例。计算nil时出错。每个”
       <% unless @stuData.blank? %>
            <%= "size = #{@stuData.size}" %>
            <%= render :partial=>'populate' , :locals=>{:stuData => @stuData} unless @stuData.nil? %>
        <% else %>
            <div>Not found...</div>
        <% end %>
    
     def populate
    
         unless params[:firstName].blank?
             filter_query +=" first_name='" + params[:firstName].to_s + "' and"
             filter_query= filter_query[0..filter_query.length-4]
    
             @stuData = Student.where(first_name: filter_query) unless filter_query.blank?
             #only sets @stuData if filter_query is present. It's likely that filter_query is not present for you
         end
    
     end