Система друзей не работает - PullRequest
0 голосов
/ 22 февраля 2011

Привет всем, я некоторое время был далеко от рельсов и догонял рельсы 3, я думаю, что моя проблема может быть связана с использованием неподдерживаемого синтаксиса от рельсов 2, который не добрался до рельсов 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 %>

Я думаю, что этовсе соответствующие коды к этому вопросу.Если вам нужно что-то еще увидеть, пожалуйста, дайте мне знать, я очень благодарен за любую помощь.Извините, если это бросается в глаза, я изучаю рубин и рельсы как хобби (и люблю это до сих пор!).

Ответы [ 3 ]

2 голосов
/ 22 февраля 2011

Когда вы видите эту ошибку:

undefined method `contact' for nil:NilClass

Обычно это означает, что вы пытаетесь вызвать метод для неназначенной переменной.Так как ошибка указывает на контроллер, а код, который вы нам показали:

def edit    
  @contact = @connection.contact
end

Я собираюсь предположить, что @connection не назначен.Обычно вы ожидаете иметь метод поиска для получения значения перед его использованием, например:

@connection = Connection.find(params[:id])

Иногда этот код помещается в before_filter, чтобы уменьшить дублирование.Если у вас есть такой фильтр, возможно, он недоступен.Трудно понять, не видя остальную часть кода контроллера.

1 голос
/ 22 февраля 2011

Проблема в том, что вы, кажется, все перепутали. В методе редактирования вашего контроллера вы ссылаетесь на @connection, который, насколько мы знаем, не был создан, как сказал Зететик, так что это nil, затем вы пытаетесь вызвать метод для него. Кажется, нам нужно еще больше информации.


Я считаю, что ваш def conn(person, contact) должен быть методом класса: def self.conn(person, contact), основанным на способе его вызова (не из объекта, а непосредственно из класса).

По сути, проблема в том, что conn выглядит как nil, я полагаю, что это по той причине, о которой я упоминал выше, но если нет, то выясните, почему вы найдете ваш ответ.

РЕДАКТИРОВАТЬ : Если вы все еще получаете ту же ошибку, то я рекомендую вам попробовать это в rails console.

Connection.find_by_person_id_and_contact_id(person, contact)

Попробуйте и используйте ту же информацию, которую вы используете в форме, которая генерирует ошибку. Скорее всего, проблема в том, что между человеком и контактом нет связи. Если вы уверены, что это так, но вышеприведенный метод говорит об обратном, то, скорее всего, проблема заключается в том, как вы устанавливаете свои ассоциации. Помните, что вы не только должны указывать связь в классе, но также должны соответствующим образом изменять таблицы, чтобы отразить связь.

0 голосов
/ 22 февраля 2011

Предполагая, что с вашими ассоциациями все в порядке, и человек ссылается на соединение.

Заменить эту строку <%- conn = Connection.conn(current_user, contact) -%> на <%- conn = @person.conn(current_user, contact) -%>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...