Ruby on Rails вызывает методы объектов
Есть кое-что, чего я не понимаю в рубине.
@items.each do |item|
item.column
end
будет работать и вернет мне значение этого столбца в рельсах. но
item = @items[some_item_id]
item.column
даст мне метод не найдено исключение для ноль. Оба раза я получаю объект, но только с первым я могу получить доступ к методам данных рельсов.
Что делают эти черточки |...| делать и как я могу получить доступ к таким методам?
4 ответа
Это собирает все элементы внутри @items
для перехода в блок:
@items.each
#each
будет работать с хэшами, массивами и другими перечислимыми.
Это выбирает определенный элемент внутри @items
:
@items[some_item_id]
Квадратные скобки - это метод (названный #[]
) для ссылки на элемент в хэшах и массивах. Если вы получите MethodNotFound
ошибка, это значит @items
не является хешем или массивом и не имеет метода с именем #[]
,
Если @items
это коллекция объектов ActiveRecord, и вы хотите выбрать один по ID, используйте:
@items.find(some_item_id)
Это потому, что во втором случае вы проходите неправильно some_item_id
, так @items[some_item_id]
не находит подходящего item
и возвращается nil
,
@items.each do |item|
item.column
end
В вышеприведенном блоке ruby выполняется перебор записей, извлеченных из базы данных. Таким образом, вы не получаете никакой ошибки nil. Но во втором случае вы пытаетесь получить запись из их индекса в @items
, Это сбой, потому что некоторые из ваших записей удаляются из базы данных. ИЛИ он потерпит неудачу в последней записи только потому, что индекс начинается с 0, а идентификатор таблицы равен 1. Таким образом, отсутствует совпадение, когда мы вызываем из индекса.
Вы должны оценить, как ActiveRecord работает с Rails
ActiveRecord
Что вы делаете, когда звоните @items.each do ...
перебирает коллекцию Item
объекты в @items
переменная. Как ruby имеет дело с зацикливанием блока кода.
Из-за отсутствия лучшего объяснения блоки кода по сути являются небольшими встроенными методами, которые имеют свои собственные локальные переменные и могут вызываться при использовании циклов (так же, как и большинство других языков программирования). Здесь важно отметить данные, которые вы имеете в @items
переменная.
-
Данные
Rails - это объектно-ориентированный фреймворк (благодаря тому, что он построен на Ruby). Это означает, что ваш @instance
переменные будут в основном рассматриваться как объекты, а это значит, что вы должны быть очень осторожны при заполнении их соответствующими данными:
Суть в том, как Marek
при условии, вы не можете установить @items = Item.all
, а затем вызвать элемент по его идентификатору из массива. object
вы имеете дело не с массивом, а с объектом, и поэтому вам придется использовать доступные вам методы для доступа к нужным вам данным.
Есть два способа получить доступ к нужным данным:
- Использовать
find
метод- Только посмотрите конкретный
Item
учет
Если вы не возражаете против хакерства, вы можете использовать ActiveRecord .find
метод:
<% item = @items.find [your_item_id] %>
<%= item.column %>
Это даст вам возможность искать конкретный элемент в коллекции @items
у тебя есть.
В качестве альтернативы, вы захотите сделать вещи "правильно", установив соответствующие @item
Объект в вашем контроллере:
#app/controllers/items_controller.rb
class ItemsController < ApplicationController
def show
@item = Item.find "your_id"
end
end