0

Я хочу, чтобы у пользователя была только одна занятость на одного пользователя. Однако я получаю ошибку «неопределенный метод« matriculations »для nil: NilClass». Как я могу заставить его работать? (Я использую его как пользовательский auth, если его вопрос).Предел создает действие для 1 сообщения для пользователя

def matriculation_limit 
    if self.user.matriculations(:reload).count <= 1 
    errors.add(:base, "Yuo already have one matriculation form") 
    else 
    redirect_to new_matriculation_path 
    end 
end 
+0

Построил вы отношения в контроллере, используя «current_user.matriculations.build» (или что-то подобное)? EDIT в действии create – dodgerogers747

+0

Я не сделал, но я попытаюсь его построить – 2013-05-08 16:11:25

+0

Что это сообщение об ошибке говорит, что 'self.user' - это нуль. Подумайте, почему это так, и вы находитесь на пути к решению вашей проблемы. –

ответ

1

С has_one ассоциации, то метод ассоциации искатель единственного числа, как @user.matriculation, а не @user.matriculations. И нет смысла подсчитывать их, потому что их будет только один.

Что касается комментариев:

Вам не нужно проверить в любом месте, сколько аттестата пользователь имеет, потому что это особая связь, так что вы просто обновлять связь (изменение идентификатора в ключевом столбце внешнего matriculation_id в таблице users)

class User < ActiveRecord::Base 
    has_one :matriculation, :class_name => "User", :foreign_key => "matriculation_id" 
end 

class Matriculation < ActiveRecord::Base 
    belongs_to :user 
end 

# some controller action... 
    @user.matriculation = Matriculation.find(params[:matriculation_id]) # or something! 
+0

Попробовал исправить создание или обновление без каких-либо успехов. Я получаю ошибку «Не удалось найти Matriculation без идентификатора». Он возвращает нуль, потому что не может найти ID ?! Не понимаю, как показать ID! – 2013-05-09 15:18:29

0

self.user == user_object.user. И похоже, что у вас нет пользователя метода для пользователя класса. И еще вещи, у вас есть HAS_ONE, так что вы должны использовать self.matriculation

так правильно будет

if self.matriculation 
    errors.add(:base, "Yuo already have one matriculation form") 
    else 
    redirect_to new_matriculation_path 
    end 
+0

'self.matriculation.count' вызовет исключение, потому что объект Matriculation будет возвращен, и у него не будет метода' count'. –

+0

да, забыл, что у вас есть отношение к одному. Фиксированный код – Avdept