从DB更改视图数据的方式

时间:2014-08-19 12:35:27

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

我需要帮助查看数据库中的数据。 我有来自DB的内容的表格,如:

<tbody>
  <% @scripts.each do |text| %>
    <tr>
      <td><%= text.book %></td>
      <td><%= text.chapter %></td>
      <td><%= text.line %></td>
      <td><%= text.body %></td>
    </tr>
  <% end %>
</tbody>

输出就是这样:

book    chapter     line    body
  1         1        1       1 Lorem ipsum....
...
  1         1        10      10 Lorem ipsum....

我想把节目号码的方式切换为书名。我在想Constant Board,比如:

脚本模型中的

BOOKS = {"1" => "Book1", "2" => "Book2" .... "66" => "Book66"

def book_name
  BOOKS[book_number]
end
脚本控制器中的

def book_number
  params[:script][:book]
end
视图文件中的

<tbody>
  <% @scripts.each do |text| %>
    <tr>
      <td><%= text.book_name %></td>
      <td><%= text.chapter %></td>
      <td><%= text.line %></td>
      <td><%= text.body %></td>
    </tr>
  <% end %>
</tbody>

当我这样做时,我收到:

undefined local variable or method `book_number' for #<Script:0x007fdf5ed16a88>

如果我使用

<td><%= text.book.book_name %></td>

我收到:

undefined method `book_name' for "1":Fixnum

有什么想法吗?请帮忙。

或者,如果我可以将新记录作为“book_name”添加到数据库作为迁移,那么这个新表将所有书籍的名称添加到书号旁边的所有书籍记录1-66中。

当前我的数据库架构如下:

create_table :scripts do |t|
  t.text :book
  t.integer :chapter
  t.integer :line
  t.text :body

我可以用它代替

<td><%= text.book %></td>

等你回答队友!此致!

3 个答案:

答案 0 :(得分:1)

你需要创建一个自定义的getter(我想?它是getter或setter!):

#app/models/script.rb
Class Script < ActiveRecord::Base
   def name
     "Book#{id}"
   end
end

这将允许您致电:

@scripts = Script.all
@scripts.each do |book|
   book.name
end

<强>物件

了解 如何运作

非常重要

您遇到的问题是您当前正在尝试在控制器中设置模型/对象属性。这是一个很大的禁忌

Rails是一个object-orientated系统,这意味着你用它做的一切都将围绕objects。对于Rails,对象Model中根据MVC Programming Pattern

定义

这意味着每次构建对象(调用Model)时,您都需要能够为模型内的对象提供各种属性/设置(其他地方) )。如此简洁地描述起来很困难,但这里需要考虑的事情:

enter image description here

如果您使用模型填充特定属性,则需要确保在模型中设置它们。其他任何东西都不会按你的意愿运作。

-

如果需要,我可以解释更多

答案 1 :(得分:0)

尝试<td><%= BOOK[text.book.to_s] %></td>

答案 2 :(得分:0)

正如我从错误中理解的那样,text.book返回一个整数,即book_number,所以为了使它工作(根据你当前的逻辑,这有点扭曲),你应该尝试这样的事情: 用脚本替换脚本模型中的book_name方法实现:

def book_name(book_number)
  BOOKS[book_number]
end

因为您当前的实现需要book_number,但您不提供它。在您的视图中,您调用它,键入book_number到book_name方法: <td><%= text.book_name(text.book.to_s) %></td>