【问题标题】:Rendering form partials - undefined method `to_key'渲染表单部分 - 未定义的方法“to_key”
【发布时间】:2017-01-05 17:52:04
【问题描述】:

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

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

但无法停止接收此错误:

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

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    您的问题在UsersController

    TransactionsController#create 方法应该没问题,因为您只引用了一个 Transaction。在 UsersController 中,您正在为 current_user 引用 Transactions 的集合,因此会出现错误。

    你应该可以把它改成

    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 的集合,以便在该视图上显示。

    【讨论】:

    • 当我重新排列我的 #app/views/users/my_transactions.html.erb 以通过 在顶部显示当前事务时,选项 2 有效,但我想显示渲染新的局部然后显示局部。我知道这与在显示部分之前渲染表单的实例变量处理有关。作为参考,_show.html.erb 以
    • @jcxswc 你的评论很不清楚。如果您想在表单下方显示部分内容,只需在&lt;%= render 'transactions/form', transaction: @user.transactions.build %&gt; 之后添加&lt;%= render 'transactions/show' %&gt;,但我会假设TransactionsController#show 是一个单一事务的RESTful 表示,其路径类似于“/transactions/:id”
    • 对不起,不够清晰。通过 _form.html.erb 正下方的 _show.html.erb 部分,我显示了完整的交易列表。因此,用户可以在网页顶部添加交易,但也可以在底部查看所有交易。在 _show.html.erb 我开始每个循环是
    【解决方案2】:

    我相信问题出在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 节

    【讨论】:

    • render 不是问题。错误是form_for(transaction),因为正在传递的本地transactionCollectionProxy 而不是Transaction 的单个实例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    相关资源
    最近更新 更多