渲染表单partials - 未定义的方法`to_key'

时间:2017-01-05 17:52:05

标签: ruby-on-rails ruby

我正在尝试在单独的控制器中呈现部分表单。

#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? %>
                ...

但无法停止接收此错误:

  

未定义的方法`to_key'用于Transaction :: ActiveRecord_Associations_CollectionProxy:0x007fc308301c18   
你的意思是?   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

提前谢谢!!我找不到任何解决方案,我已经阅读了大量文档,希望能够解决。

修改

渲染调用的更清晰视图(由@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' %>

显示部分

的清晰视图
#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>

2 个答案:

答案 0 :(得分: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的集合,以便在该视图上显示。

答案 1 :(得分:0)

我认为问题发生在render方法: 在这里,您传递的是@transaction,就好像它是一个对象,但它是一个集合。您应该将收集选项与render一起使用。像这样:

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

有关Rails指南(http://guides.rubyonrails.org/layouts_and_rendering.html

的第3.4.5节的更多信息