【问题标题】:RoR: How to show/print data from other model on a table?RoR:如何在表格上显示/打印来自其他模型的数据?
【发布时间】:2015-08-29 23:30:43
【问题描述】:

我有一个名为“Notes”的表格,并在 _form.html.erb 中有一个下拉列表,其中包含一个名为 subject 的模型中的主题列表,该模型有效。

<div class="field">
    <%= f.label :subject, class: 'dropdown' %>
      <div class="dropdown">
      <div class="field">

        <%= f.collection_select(:id, Subject.all, :id, :subject) %>

  </div>

问题是我无法将它打印到“显​​示”或“表格”,我想知道如何做到这一点?

笔记索引视图:

<tbody>
    <% @notes.each do |note| %>
      <tr>
        <td><%= note.created_at.localtime %></td>
        <td><%= note.updated_at.localtime %></td>
        <td><%= note.user_id %></td>
        <td><%= note.user.full_name %></td>
        <td><%= note.user.email %></td>
        <td><%= note.studentname %></td>
        **<td><%= note.subject.subject %></td>**
        <td><%= note.grievance %></td>
        <td><%= note.penalty %></td>
        <td><%= link_to 'Show', note, class: 'btn btn-primary btn-xs' %></td>

我知道我必须在 notes_controller 中定义主题模型。我一直在尝试这样做,但没有成功。

  def subject
    @subject = Subject.all
  end

主题架构

create_table "subjects", force: :cascade do |t|
    t.string   "subject"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

我要做的就是在主题下拉列表中选择选项,从主题模型中填充,以在注释表上显示/打印。我是rails的新手。非常感谢任何帮助,如果需要,将提供更多代码。谢谢!

【问题讨论】:

  • 我不确定你愿意实现什么,但是定义动作subject 对你没有任何好处,可能任务应该在show 动作中完成。
  • 谢谢,我有一个下拉选项菜单,其中包含从主题表中填充的主题列表,我想将用户选择的选项打印到上面的注释表中。我尝试了你的建议,但我仍然得到 nil:NilClass 的未定义方法“主题”

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

看起来您正在寻找“has_one”活动记录关联。为了让您能够致电note.subject,您需要设置此关联。这是http://guides.rubyonrails.org/association_basics.html 的样子。

class Notes < ActiveRecord::Base
  has_one :subject
end

您还需要如下所示的数据库迁移:

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_reference :subjects, :notes, index: true
  end
end

如果您确实需要主题模型,则可以选择此选项。如果您只是试图只允许某些输入(通过您的下拉菜单)并且不需要您的主题实际上是一个模型,您可能想要查看枚举: http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html。在这种情况下,您只需在 Notes 模型 (model/notes.rb) 中声明一个枚举,如下所示:

 enum subject: [ :none, :math, :science, :history, ...etc ]

这允许你调用:

<%= f.select :subject, options_for_select(Notes.subject_array) %>

subject_array 是在 Notes 模型中声明的方法,如下所示:

def subject_array
  a = Notes.subjects.map do |k,v|
    [k.humanize, k]
  end
  return a
end  

这会以读者友好的方式返回枚举中的所有主题(用空格代替下划线等)。枚举可能很棘手,但它是为模型生成定义的可能值列表的好方法属性(例如您的案例中的注释主题)。这样,您甚至不需要主题模型。

【讨论】:

  • 哇!谢谢,实际上我现在以我上面复杂的方式让它工作了,但你的帖子对未来也是很好的建议!我非常感谢。 FWIW 我接受了上面的建议并做了 并且它有效
【解决方案2】:
 <%= f.collection_select(:subjectid, Subject.all, :id, :subject) %> 

应该包含一个名称作为第一个参数。在选择@notes 的控制器方法中,此值可用于选择该主题的特定注释。

@notes = Note.find_by_subjectid(:subjectid)

希望这会有所帮助,如果不是,请在您的问题中更具体一点

【讨论】:

  • 好的,非常感谢,您的建议我已经取得了一些成功。现在唯一的问题是它正在打印主题 ID 而不是名称,但至少正在打印一些内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 2011-07-26
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
相关资源
最近更新 更多