Я хотел создать очень простую социальную сеть.Я начал с двух моделей: Пользователь (используя Devise Gem) и его Профиль.Они связаны отношением 1 к 1, поэтому мои маршруты выглядят следующим образом:
resources :users do
resource :profile
end
У меня есть соответствующий контроллер - вот код для создания профиля (редактирование почти такое же):
def new
@profile = current_user.create_profile
end
def create
@profile = current_user.profile.create(params[:profile])
if @profile.save
redirect_to user_profile_path(current_user)
else
render :action => "new"
end
end
Я использовал переменную current_user, потому что пользователю не разрешено создавать профиль для кого-то другого, независимо от того, что он вводит в адресной строке.
В представлении 'new' я получилФорма:
- form_for [@profile.user, @profile] do |p|
(fields omitted)
Это работает так, как я ожидал - пользователи могут добавлять свои данные в профили и после нажатия «Сохранить» перенаправляются на вновь созданную страницу.Однако, когда я пытаюсь добавить некоторые проверки в модель профиля (даже простые, такие как validates_presence_of ) и затем создать новый профиль, мой контроллер показывает мне ошибку:
undefined method `user_profiles_path' for #<#<Class:0xb2d3e5c>:0xb2d2728>
Extracted source (around line #1):
1: - form_for [@profile.user, @profile] do |p|
Это странно, но эта проблема не возникает при обновлении информации профиля, только при попытке создать новую.Я нашел решение, предложив мне указать URL перенаправления в помощнике form_for.Итак, я изменил это на мой взгляд:
- form_for [@profile.user, @profile], :url => user_profile_path(@profile.user) do |p|
Это все еще не работает.Он отображает нужный мне вид (с самого начала сообщение об ошибке проверки, но я мог бы с этим смириться ;-)), но после нажатия «Сохранить» возникает другая проблема:
undefined method `create' for nil:NilClass
Я нахожуэто еще более странно, поскольку он отображает объект параметра в деталях ошибки, он содержит правильные данные и представляет собой все, но не ноль.У меня закончились идеи, что может быть не так.
Мне немного любопытно.В чем причина моей проблемы и как ее исправить?
Заранее спасибо!