У меня есть следующие модели:
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 %>
Можете ли вы добавить подробное сообщение об ошибке?
@sreangrathanak Это сообщение об ошибке, которое я получил в браузере. Должен ли я поделиться тем, что в журнале?
@Laxman, лучше иметь информацию.
Принимает ли account_params параметры account_configs? Вы также должны проверить, присутствуют ли account_configs для учетной записи? Если да, то вам следует повторить только то же самое.
@КрупаСутар Да. Он принимает и создается со страницы create
. Проблема на странице show
.
Для той же учетной записи, можете ли вы использовать each_with_index в консоли rails?
@KrupaSuthar Нет, я не могу использовать.
Тогда должны быть какие-то проблемы только с моделями. Можете ли вы поделиться точным кодом, который есть у ваших моделей?
@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
?
Объект @Laxman user
может быть перечисляемым, если я покажу его как [user]
, но мне нужно проверить код в этом месте, чтобы предоставить лучшую альтернативу, только что разъяснил вашу ошибку.
Мой текущий код работает, но я все еще перебираю configs
, а не config
. Так могу ли я улучшить настоящий код?
да. Причина, которую вы указали выше, является фактической причиной, потому что метод record_list
содержит each_with_index
и ожидал enumerable
, тогда как я отправлял один объект, и [config]
работал на меня. Поэтому, пожалуйста, добавьте свой комментарий к ответу. Я приму это как решение.
@ Лаксман, да, сделал. Но проверьте другие случаи, когда эти изменения не повредят :)
Конечно. Я проверю. :)
мы не можем использовать 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
. Он не опубликовал этот код хорошо.
а можно код контроллера?