嘿所有,我已经离开rails一段时间并且已经赶上rails 3,我认为我的问题可能源于我使用rails 2中不支持的语法而没有使用rails 3.不管怎样,我的问题问题可能是广泛但我已经能够解决这个应用程序的所有其他问题,这个仍然困扰我。
在网站的主页上有以下代码:
<%- unless @requested_contacts.empty? -%>
<h2>Contact Requests</h2>
<ul class="list requests small">
<%- @requested_contacts.each do |contact| -%>
<%- conn = Connection.conn(current_user, contact) -%>
<li>
<p><%= person_link contact %></p>
<p class="meta published">
<%= time_ago_in_words(conn.created_at) %>
ago
</p>
<p>
<%= link_to "Respond", edit_connection_path(conn) %> |
<%= link_to "View profile", contact %>
</p>
</li>
<%- end -%>
</ul>
<%- end -%>
当我点击响应而不是进入连接编辑页面时,我收到错误:
undefined method `contact' for nil:NilClass
app/controllers/connections_controller.rb:15:in `edit'
{"id"=>"4"}
控制器代码为:
def edit
@contact = @connection.contact
end
相关模型是Person.rb:
has_many :connections
has_many :contacts, :through => :connections, :order => 'people.created_at DESC'
has_many :requested_contacts, :through => :connections, :source => :contact
Connection.rb:
belongs_to :person
belongs_to :contact, :class_name => "Person", :foreign_key => "contact_id"
def conn(person, contact)
find_by_person_id_and_contact_id(person, contact)
end
我想要的编辑页面是:
<h2>Contact request</h2>
<p>You have a contact request from <%= @contact.name %></p>
<% form_for(@connection) do |f| %>
<p>
<%= f.submit "Accept", :class => "button" %>
<%= f.submit "Decline", :id => nil, :class => "button" %>
</p>
<% end %>
我认为这是该问题的所有相关代码。如果还有其他什么你可能需要看到,请告诉我,我非常感谢任何帮助。对不起,如果它是明显的眩光,我正在学习ruby和rails作为一种爱好(并且喜欢它到目前为止!)。
答案 0 :(得分:2)
当您看到此错误时:
undefined method `contact' for nil:NilClass
这通常意味着您尝试在未分配的变量上调用方法。由于错误指向控制器,您向我们展示的代码是:
def edit
@contact = @connection.contact
end
我猜测@connection
未分配。通常你会期望在使用它之前有一个finder方法来检索它,比如:
@connection = Connection.find(params[:id])
有时,此代码会放在before_filter
中,以减少重复。如果你有这样的过滤器,也许它没有达到。没有看到控制器代码的其余部分就很难知道。
答案 1 :(得分:1)
问题是你似乎混淆了。在你的控制器的编辑方法中,你引用了@connection
,据我们所知,还没有实例化,就像zetetic所说,所以它是nil
,然后你试着在它上面调用一个方法。我们似乎需要更多的信息。
我相信你的def conn(person, contact)
应该是一个类方法:def self.conn(person, contact)
,基于你调用它的方式(不是来自一个对象,而是直接来自类)。
基本上,问题是conn
即将出现nil
,我相信这是我上面提到的原因,但如果没有,那么找出原因会找到你的答案。
编辑:如果您仍然遇到同样的错误,我建议您在rails console
中尝试一下。
Connection.find_by_person_id_and_contact_id(person, contact)
尝试并使用您在生成错误的表单中使用的相同信息。最有可能的问题是人和联系人之间没有联系。如果您确定存在但上述方法另有说明,则很可能存在如何设置关联的问题。请记住,您不仅需要在类中指定关联,还必须相应地修改表以反映关联。
答案 2 :(得分:0)
假设您的关联正常,并且人员引用了连接。
将此行<%- conn = Connection.conn(current_user, contact) -%>
替换为<%- conn = @person.conn(current_user, contact) -%>