【问题标题】:Undefined Method Error When Rendering Partial渲染部分时出现未定义的方法错误
【发布时间】:2014-05-28 05:55:29
【问题描述】:

所以,我完全理解为什么通常会收到未定义的方法错误,但是,我不确定为什么会在这个特定时间发生。

我有一个部分:

submissions/_submission.html.erb

<div class="pure-u-1-2 rounded">
 <%= link_to submission do %>
  <div class="rounded" style="background-color: #B81324; color: #E6E6E6; margin: 10px; padding:5px;">
  <div class="clear">Project: <%= submission.project.title %></div>
  <div class="clear">Submitted By: <%= submission.submitter.username %></div>
  <div class="clear">Amount: $<%= submission.price %></div>
  <div class="clear">Description: <%= submission.description %></div>
  </div>
 <% end %>
</div>

这个部分在我的dashboard/index.html.erb中被使用了两次 一次呈现收到的提交的集合,再次呈现已发送的提交的集合:

dashboards/index.html.erb

<% if @received_submissions.length > 0 %>
 <div class="pure-u-1" id="projects"><h3 class="red">Final Tracks Received (<%= @received_submissions.length %>)</h3>
  <%= render :partial => :submission, :collection => @received_submissions %>
 </div>
<% end %>

<% if @sent_submissions.length != 0 %>
 <div class="pure-u-1" id="projects"><h3 class="red">Final Tracks Sent (<%= @sent_submissions.length %>)</h3>
  <%= render :partial => :submission, :collection => @sent_submissions %>
 </div>
<% end %>

但是,渲染收到的提交可以正常工作,并且渲染发送的提交错误:

undefined method `submissions' for #<PlayerProject:0x000001052730e8>

这也是dashboards_controller,以防万一:

class DashboardsController < ApplicationController
 before_filter :authenticate_user!

 def index
  @compact = current_user.projects.where.not(status: ['Deleted','Closed']).order("id desc")
  @projects = current_user.projects.where.not(status: ['Deleted','Closed']).order("id desc")
  @received_messages = current_user.received_messages
  @received_submissions = current_user.projects.collect{|p| p.submissions }.flatten

  @player = current_user.player_projects.collect{|pp| pp.project}
  @sent_submissions = current_user.player_projects.collect{|ps| ps.submissions }.flatten
 end
end

models/player_project.rb'

class PlayerProject < ActiveRecord::Base
  belongs_to :project
  belongs_to :player, :class_name => "User"
end

models/submission.rb

class Submission < ActiveRecord::Base
 belongs_to :submitter, :class_name => "User"
 belongs_to :recipient, :class_name => "User"
 belongs_to :project

 validates :amount_in_cents, :presence => true, length: { minimum: 2, :message => " must be more than $0" }
 validates :description, :presence => { :message => " cannot be blank" }
 validates :final_track_url, :presence => { :message => " Required" }

 def price
     sprintf "%.2f", (self.amount_in_cents.to_f/100.0)
 end

 def price=(val)
     self.amount_in_cents = (val.to_f*100.0).to_i
 end

 def paid?
     !!self.paypal_confirmation
 end

end

【问题讨论】:

  • 您的User 模型中有has_many :player_projects 关联吗?
  • 是的,我其实有has_many :player_projects, :foreign_key =&gt; 'player_id'

标签: ruby-on-rails ruby arrays rendering partials


【解决方案1】:

我认为您的错误将是模型级别的:

undefined method `submissions' for #<PlayerProject:0x000001052730e8>

协会

这通常表明您没有设置特定的关联(即您在未定义 x 时调用 @model.x):

@sent_submissions = current_user.player_projects.collect{|ps| ps.submissions }.flatten

虽然您的player_projects 已定义,但我认为您的submissions 属性/关联不存在。此外,您可以使用pluck 方法来帮助解决此问题:current_user.player_projects.pluck(:submissions)

首先,您的表中有submissions 属性吗?

其次,如果你不这样做,你想用它来达到什么目的?您的表中通常没有复数列(表示多个数据存储)。我会在连接模型上使用关联

【讨论】:

  • 我不确定我是否提供了您需要的信息...但是提交有一个 submitter_id 列,这是我实际需要与当前用户进行比较以区分它是他们派来的。所以也许它需要是 where(submission.submitter.id = current.user.id") 或类似的东西?
  • 好的,那么您正在尝试循环访问 submissions 模型上的 submissions 关联?
  • 我试过@sent_submissions = current_user.player_projects.where(submitter_id: current_user)我不确定这是否越来越近了?
  • 距离 suer 越来越近了——你想达到什么目的?只显示特定项目、特定用户的提交?
  • 顺便说一句,您的查询需要是:@sent_submissions = current_user.player_projects.where(submitter_id: current_user.id)
【解决方案2】:

试试这个

<%= render "submission", :collection => @sent_submissions %>

【讨论】:

  • 感谢您的建议;从长远来看,它可能会有所帮助,至少可以简化我的代码,但我仍然收到同样的错误。还是谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
相关资源
最近更新 更多