首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改从数据库查看数据的方式

更改从数据库查看数据的方式
EN

Stack Overflow用户
提问于 2014-08-19 20:35:27
回答 3查看 60关注 0票数 0

我需要一个从数据库查看数据的方式帮助。我有一个包含来自DB的内容的表格,就像这样:

代码语言:javascript
复制
<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>

输出是这样的:

代码语言:javascript
复制
book    chapter     line    body
  1         1        1       1 Lorem ipsum....
...
  1         1        10      10 Lorem ipsum....

我想切换显示书号为书名的方式。我在想不变的板子,比如:

在脚本模型中:

代码语言:javascript
复制
BOOKS = {"1" => "Book1", "2" => "Book2" .... "66" => "Book66"

def book_name
  BOOKS[book_number]
end

在脚本控制器中:

代码语言:javascript
复制
def book_number
  params[:script][:book]
end

在视图文件中:

代码语言:javascript
复制
<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>

当我这样做的时候,我会收到:

代码语言:javascript
复制
undefined local variable or method `book_number' for #<Script:0x007fdf5ed16a88>

如果我使用

代码语言:javascript
复制
<td><%= text.book.book_name %></td>

我收到:

代码语言:javascript
复制
undefined method `book_name' for "1":Fixnum

有什么想法吗?请帮帮忙。

或者,如果我可以添加新的记录作为"book_name“到数据库作为迁移,这样做作为新的表,所有图书的名称添加到所有图书记录1-66旁边的图书编号。

当前的my DB模式如下:

代码语言:javascript
复制
create_table :scripts do |t|
  t.text :book
  t.integer :chapter
  t.integer :line
  t.text :body

我可以用它来代替

代码语言:javascript
复制
<td><%= text.book %></td>

等待你的回答,伙伴们!致以问候!

EN

回答 3

Stack Overflow用户

发布于 2014-08-19 22:24:06

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

代码语言:javascript
复制
#app/models/script.rb
Class Script < ActiveRecord::Base
   def name
     "Book#{id}"
   end
end

这将允许您调用:

代码语言:javascript
复制
@scripts = Script.all
@scripts.each do |book|
   book.name
end

对象

你知道它是如何工作的,这一点非常重要

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

Rails是一个object-orientated系统,这意味着您使用它所做的一切都将围绕着Rails展开。对于Rails,按照MVC Programming PatternModel中定义对象

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

如果您使用模型来填充特定属性,则需要确保在模型本身中设置这些属性。其他任何东西都不会像你想要的那样工作。

--

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

票数 1
EN

Stack Overflow用户

发布于 2014-08-19 20:44:14

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

票数 0
EN

Stack Overflow用户

发布于 2014-08-19 20:53:10

据我从错误中理解,text.book返回一个整数,它是book_number,所以要让它工作(根据您当前的逻辑,这有点扭曲),您应该尝试类似这样的操作:将脚本模型中的book_name方法实现替换为以下代码:

代码语言:javascript
复制
def book_name(book_number)
  BOOKS[book_number]
end

因为您当前的实现需要book_number,但是您没有提供它。在您的视图中,您可以通过键入book_number to book_name方法:<td><%= text.book_name(text.book.to_s) %></td>来调用它

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25383589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档