Неопределенный метод `each_with_index' для модели в Rails 4

У меня есть следующие модели:

class Account
  has_many :account_configs
  accepts_nested_attributes_for :account_configs
end

class AccountConfig
  belongs_to :account
end

контроллер

def show
end


def new
  @account = Account.new
  @account_config = @account.account_configs.build
end

def create
  @account = Account.new(account_params)
  if @account.save
    redirect_to account_path(@account), notice: 'Account was successfully created.'
  else
    render :new
  end
end

def account_params
      params.require(:account).permit(:name, account_configs_attributes: [:id, :type, :duration, :branch]) if params[:account]
end

После создания модели Account с ее конфигом во вложенной форме я должен показать ее на странице show. Мне нужно перебрать это ActiveRecord_Associations_CollectionProxy - @account.account_configs. Также есть ранее написанный файл layout_builder. Мне также нужно расширить тот же макет для этой страницы. Когда я пытаюсь зациклить вот так

@account.account_configs.each do |config|
  #here extending from the layout which has other check methods
end

Я получаю эту ошибку: undefined method each_with_index for #<AccountConfig:0----->.

Но вместо each, если я использую where на том же, макет расширяется и отображается. Я могу использовать where, но много кода повторяется. Что мне сделать, чтобы эта ошибка исчезла в этом случае?

журнал ошибок

D, [2019-07-24T14:06:35.851681 #25672] DEBUG -- :   Account Load (1.2ms)  SELECT  `accounts`.* FROM `accounts` WHERE `accounts`.`id` = 5 LIMIT 1
D, [2019-07-24T14:06:35.863820 #25672] DEBUG -- :   AccountConfig Load (1.3ms)  SELECT  `account_config`.* FROM `account_config` WHERE `account_config`.`account_id` = 5  ORDER BY `account_config`.`id` ASC LIMIT 1
D, [2019-07-24T14:06:35.874536 #25672] DEBUG -- :   CACHE (0.0ms)  SELECT  `account_config`.* FROM `account_config` WHERE `account_config`.`account_id` = 5  ORDER BY `account_config`.`id` ASC LIMIT 1  [["account_id", 5]]
D, [2019-07-24T14:06:35.887123 #25672] DEBUG -- :   Account Load (1.1ms)  SELECT `accounts`.`id`, `accounts`.`name` FROM `accounts` WHERE `accounts`.`account_id` = 5
D, [2019-07-24T14:06:35.896571 #25672] DEBUG -- :   AccountConfig Load (1.2ms)  SELECT  `account_config`.* FROM `account_config` WHERE `account_config`.`account_id` = 5  ORDER BY `account_config`.`id` ASC LIMIT 1000
I, [2019-07-24T14:06:35.922217 #25672]  INFO -- :   Rendered customer/accounts/show.html.erb within layouts/customer (62.6ms)
I, [2019-07-24T14:06:35.930145 #25672]  INFO -- : Completed 500 Internal Server Error in 101ms (ActiveRecord: 6.9ms)
F, [2019-07-24T14:06:35.960592 #25672] FATAL -- : 
NoMethodError - undefined method `each_with_index' for #<AccountConfig:0x00005581ed35b6e0>:
  lib/layout_builder.rb:693:in `records'
  app/views/customer/accounts/show.html.erb:37:in `block (4 levels) in _app_views_customer_accounts_show_html_erb___136536495548701304_47008262570920'
  lib/layout_builder.rb:641:in `initialize'
  lib/layout_builder.rb:216:in `record_list'
  app/views/customer/accounts/show.html.erb:33:in `block (3 levels) in _app_views_customer_accounts_show_html_erb___136536495548701304_47008262570920'
  app/views/customer/accounts/show.html.erb:31:in `block (2 levels) in _app_views_customer_accounts_show_html_erb___136536495548701304_47008262570920'
  lib/layout_builder.rb:162:in `block in article'
  lib/layout_builder.rb:281:in `level'
  lib/layout_builder.rb:160:in `article'
  app/views/customer/accounts/show.html.erb:2:in `block in _app_views_customer_accounts_show_html_erb___136536495548701304_47008262570920'
  lib/layout_builder.rb:153:in `page'
  app/views/customer/accounts/show.html.erb:1:in `_app_views_customer_accounts_show_html_erb___136536495548701304_47008262570920'

D, [2019-07-24T14:06:36.118610 #25672] DEBUG -- : 
D, [2019-07-24T14:06:36.118734 #25672] DEBUG -- : 
I, [2019-07-24T14:06:36.118873 #25672]  INFO -- : Started POST "/__better_errors/60b69c8a4bd7e26b/variables" for 127.0.0.1 at 2019-07-24 14:06:36 +0530

показать.html.erb

<% configs = @account.account_configs %>    

<% configs.each do |config| %>
<div class = "custom-class"><h2><%= "#{config.type}" %></h2></div>

  <% a.record_list configs do |rl| %>
    <% rl.header 'duration' %>
    <% rl.header 'branch' %>
    <% rl.records do |data| %>
      <% if data.type == "#{config.type}" %>
        <% rl.show data.duration %>
        <% rl.show data.branch %>
      <% end %>
    <% end %>
  <% end %>
<% end %>

а можно код контроллера?

Gagan Gupta 24.07.2019 10:59

Можете ли вы добавить подробное сообщение об ошибке?

sreang rathanak 24.07.2019 11:02

@sreangrathanak Это сообщение об ошибке, которое я получил в браузере. Должен ли я поделиться тем, что в журнале?

Lax_Sam 24.07.2019 11:09

@Laxman, лучше иметь информацию.

sreang rathanak 24.07.2019 11:11

Принимает ли account_params параметры account_configs? Вы также должны проверить, присутствуют ли account_configs для учетной записи? Если да, то вам следует повторить только то же самое.

Krupa Suthar 24.07.2019 11:14

@КрупаСутар Да. Он принимает и создается со страницы create. Проблема на странице show.

Lax_Sam 24.07.2019 11:31

Для той же учетной записи, можете ли вы использовать each_with_index в консоли rails?

Krupa Suthar 24.07.2019 11:42

@KrupaSuthar Нет, я не могу использовать.

Lax_Sam 24.07.2019 11:46

Тогда должны быть какие-то проблемы только с моделями. Можете ли вы поделиться точным кодом, который есть у ваших моделей?

Krupa Suthar 24.07.2019 11:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
931
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

@account.account_configs.each do |config| будет циклически предоставлять вам каждый AccountConfig отдельный объект в виде блочной переменной config, для которой вы вызвали each_with_index

each_with_index поддерживается только для collection/enumerable объекта, а не для одного объекта AccountConfig.

У меня была такая же ошибка, когда я вызывал этот метод для объекта User,

NoMethodError: undefined method `each_with_index' for #<User:0x00000007128c00>

Проверьте следующее для each_with_index,

lib/layout_builder.rb:216:in `record_list'
lib/layout_builder.rb:693:in `records'

Решение-

Вы можете обойти это, передав объект config как [config], который будет действовать как перечисляемый объект

да. Я читаю это. Так есть ли способ изменить его на enumerable? Или я должен использовать where?

Lax_Sam 24.07.2019 12:05

Объект @Laxman user может быть перечисляемым, если я покажу его как [user], но мне нужно проверить код в этом месте, чтобы предоставить лучшую альтернативу, только что разъяснил вашу ошибку.

ray 24.07.2019 12:29

Мой текущий код работает, но я все еще перебираю configs, а не config. Так могу ли я улучшить настоящий код?

Lax_Sam 24.07.2019 12:44

да. Причина, которую вы указали выше, является фактической причиной, потому что метод record_list содержит each_with_index и ожидал enumerable, тогда как я отправлял один объект, и [config] работал на меня. Поэтому, пожалуйста, добавьте свой комментарий к ответу. Я приму это как решение.

Lax_Sam 24.07.2019 13:02

@ Лаксман, да, сделал. Но проверьте другие случаи, когда эти изменения не повредят :)

ray 24.07.2019 13:09

Конечно. Я проверю. :)

Lax_Sam 24.07.2019 13:10

мы не можем использовать each_with_index для одного объекта, он работает с активной коллекцией записей. Если вам нужен индекс объектов account_configs внутри текущего цикла. Попробуйте с этим циклом.

@account.account_configs.each_with_index do |config, index|
  # index - will give the current loop count.
end

Проблема находится внутри lib/layout_builder.rb, который вызывается через record_list. Он не опубликовал этот код хорошо.

ray 24.07.2019 14:27

Другие вопросы по теме