Невозможно добавить какие-либо проверки в единую модель ресурсов в Rails 3 - PullRequest
1 голос
/ 12 декабря 2010

Я хотел создать очень простую социальную сеть.Я начал с двух моделей: Пользователь (используя 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

Я нахожуэто еще более странно, поскольку он отображает объект параметра в деталях ошибки, он содержит правильные данные и представляет собой все, но не ноль.У меня закончились идеи, что может быть не так.

Мне немного любопытно.В чем причина моей проблемы и как ее исправить?

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 25 декабря 2010

Я бы предложил следующее:

# user.rb
  def initialize(*params)
    super(*params)
    self.build_profile unless self.profile
  end
0 голосов
/ 04 июня 2011

Во-первых: Убедитесь, что есть current_user, требуйте, чтобы пользователь вошел в систему.

Во-вторых: Вы получаете метод user_profiles_path для нового, потому что профиль не сохраняется. В этом случае метод генерации URL в рельсах будет множественным. Если вам нужен правильный URL-адрес все время, используйте: [@profile.user, :profile]. Вы можете сделать это, так как для каждого пользователя существует только один профиль, а идентификатор профиля не нужен.

Третье: В вашем действии создания замените

@profile = current_user.profile.create(params[:profile])
# with 
@profile = current_user.build_profile(params[:profile])

Последний раз: Подумайте об отсутствии разницы между созданием и редактированием профиля. Для вашего конечного пользователя это не будет иметь никакого значения. Вы можете добавить в фильтр перед созданием пустой профиль, если он отсутствует. Это также будет меньше кода для вас. поддерживать

0 голосов
/ 12 декабря 2010

Попробуйте

@profile = current_user.create_profile(params[:profile])

В вашем действии создания вместо .profile.create

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