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 вы имеете дело не с массивом, а с объектом, и поэтому вам придется использовать доступные вам методы для доступа к нужным вам данным.

Есть два способа получить доступ к нужным данным:

  1. Использовать find метод
  2. Только посмотрите конкретный 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
Другие вопросы по тегам