2017-01-05 3 views
0

Я пытаюсь отобразить форму частично в отдельном контроллере.Рендеринг формы partials - undefined метод `to_key '

#app/views/users/my_transactions.html.erb 
<%= render 'transactions/form', transaction: @transaction %> 

Форма страницы.

#app/views/transactions/_form.html.erb 
<%= form_for(transaction) do |f| %> 
    <% if transaction.errors.any? %> 
       ... 

Но не может остановить получаю эту ошибку:

undefined method `to_key' for Transaction::ActiveRecord_Associations_CollectionProxy:0x007fc308301c18
Did you mean?
to_query
to_set
to_ary

Мои контроллеры:

#app/controllers/transactions_controller.rb 
def create 
    @transaction = Transaction.new(transaction_params) 
    @transaction.user = current_user 
        ... 

и

#app/controllers/users_controller.rb 
def my_transactions 
    @transaction = current_user.transactions 
    @user = current_user 
end 

Спасибо заранее !! Я не могу найти решения для этого, и я уже прочитал хороший кусок документации в надежде на разрешение.

Редактировать

Clearer вид визуализации вызовов (с исправлением по @engineersmnky)

#app/views/users/my_transactions.html.erb 
<h3>New Transaction</h3> 
<%= render 'transactions/form', transaction: @user.transactions.build %> 
<h3>Current Transactions</h3> 
<%= render 'transactions/show' %> 

Clear вид шоу частичное

#app/views/transactions/_show.html.erb 
<% @user.transactions.each do |transaction| %> 
<tr> 
    <td class="date"><%= transaction.created_at.strftime("%D") %></td> 
    <td><%= transaction.amount %></td> 
    <td class="convert-category"><%= transaction.category %></td> 
    <td class="convert-sub-category"><%= transaction.sub_category %></td> 
    <td><%= transaction.notes%></td> 

ответ

0

Ваш вопрос находится в UsersController.

Метод TransactionsController#create должен быть точным, поскольку вы ссылаетесь только на один Transaction. В UsersController вы ссылаетесь на сборник Transactions на current_user, следовательно, на ошибку.

Вы должны быть в состоянии просто изменить это

def my_transactions 
    @transaction = current_user.transactions.build 
    @user = current_user 
end 

@transaction Таким образом, будет один новый Transaction, связанный с current_user в обоих контекстах.

Другой вариант, если вы показываете все транзакции и возможность добавлять новую затем оставить UsersController в покое и изменить рендер заявление:

#app/views/users/my_transactions.html.erb 
<%= render 'transactions/form', transaction: @user.transactions.build %> 

Это будет иметь тот же эффект на форме как указано выше, но оставит вашу переменную экземпляра @transaction в виде коллекции Transactions для отображения в этом представлении.

+0

Вариант 2 работает, когда я изменить порядок # приложение/просмотров/пользователей/my_transactions.html.erb для отображения текущих операций наверху через транзакции <% render '/ show'%>, но я хочу, чтобы дисплей отображал новый частичный, а затем частичный показ.Я знаю, что это имеет какое-то отношение к обработке переменных экземпляра для рендеринга формы до частичного отображения. Для справки, _show.html.erb начинается с <% @ user.transactions.each do | transaction | %> – jcxswc

+0

@jcxswc Вы комментируете очень неясно. Если вы хотите показать частичное ниже формы, просто добавьте '<% = render 'transaction/show'%>' после '<% = render 'transaction/form', transaction: @ user.transactions.build%>', но я бы предположили, что «TransactionsController # show» предназначалось для представления RESTful одной транзакции с таким путем, как «/ transaction /: id» – engineersmnky

+0

Извините за отсутствие ясности. Через частичное _show.html.erb прямо под _form.html.erb, я показываю полный список транзакций. Таким образом, пользователь может добавить транзакцию в верхней части веб-страницы, но также может просматривать ВСЕ транзакции внизу. В _show.html.erb мой запуск каждого цикла - это <% @ user.transactions.each do | transaction | %> – jcxswc

0

Я считаю, что проблема в методе render: Здесь вы передаете @transaction, как если бы это был единственный объект, но это коллекция. Вы должны использовать опцию коллекции с render. Что-то вроде этого:

# app/views/users/my_transactions.html.erb 
<%= render partial: 'transactions/form', collection: @transactions %> 

Больше в разделе 3.4.5 Rails Guides (http://guides.rubyonrails.org/layouts_and_rendering.html)

+0

'render' не является проблемой. Ошибка является 'form_for (transaction)', потому что локальная 'транзакция' передается' CollectionProxy' не один экземпляр 'Transaction' – engineersmnky

Смежные вопросы