Ruby on rails 无法在Rails 3的单个资源模型中添加任何验证

Ruby on rails 无法在Rails 3的单个资源模型中添加任何验证,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我想创建一个非常简单的社交网络。我从两个模型开始:用户(使用Desive gem)和他的个人资料。它们通过1对1关系连接,因此我的路线看起来像: resources :users do resource :profile end 我有一个合适的控制器-以下是创建配置文件的代码(编辑基本相同): 我使用了current_user变量,因为无论用户在地址栏中键入什么,都不允许用户为其他人创建配置文件 在“新”视图中,我有一个表单: - form_for [@profile.user, @p

我想创建一个非常简单的社交网络。我从两个模型开始:用户(使用Desive gem)和他的个人资料。它们通过1对1关系连接,因此我的路线看起来像:

resources :users do
    resource :profile
end
我有一个合适的控制器-以下是创建配置文件的代码(编辑基本相同):

我使用了current_user变量,因为无论用户在地址栏中键入什么,都不允许用户为其他人创建配置文件

在“新”视图中,我有一个表单:

- form_for [@profile.user, @profile] do |p|
    (fields omitted)
它的工作原理和我预期的一样——用户可以将他们的数据添加到配置文件中,点击“保存”后会重定向到他们新创建的页面。但是,当我尝试向配置文件模型添加一些验证(即使是简单的验证,如验证的存在),然后创建新配置文件时,我的控制器向我显示一个错误:

undefined method `user_profiles_path' for #<#<Class:0xb2d3e5c>:0xb2d2728>

Extracted source (around line #1):
1: - form_for [@profile.user, @profile] do |p|
它仍然不起作用。它显示我想要的视图(从一开始就显示一条验证错误消息,但我可以接受;-),但在点击“保存”后,它会产生另一个问题:

undefined method `create' for nil:NilClass
我发现它甚至更奇怪,因为它在错误详细信息中显示参数对象,它包含正确的数据,并且是一切,但不是零。我没有主意了,有什么不对劲的

我有点好奇。是什么导致了我的问题以及如何解决

提前谢谢

试试看

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

在您的创建操作-而不是.profile.create中,我建议您:

# user.rb
  def initialize(*params)
    super(*params)
    self.build_profile unless self.profile
  end
第一: 确保有当前用户,要求该用户登录

第二: 由于配置文件未持久化,因此您将在new上获得user_profiles_path方法。在这种情况下,rails中的url生成方法将多元化。如果您希望始终使用正确的url,请使用:
[@profile.user,:profile]
。您可以这样做,因为每个用户只有一个配置文件,并且不需要配置文件id

第三: 在创建操作中,替换

@profile = current_user.profile.create(params[:profile])
# with 
@profile = current_user.build_profile(params[:profile])
最后:
考虑在创建和编辑配置文件之间没有区别。对于您的最终用户来说,这不会有任何区别。如果缺少空配置文件,可以在创建空配置文件之前添加过滤器。它也将减少代码为您。为了维护

它仍然不断地说“未定义nil的方法”,只是这次它找不到“create_profile”。在这种情况下,听起来当前的_用户是nil!请尽量不要一次问一个问题
# user.rb
  def initialize(*params)
    super(*params)
    self.build_profile unless self.profile
  end
@profile = current_user.profile.create(params[:profile])
# with 
@profile = current_user.build_profile(params[:profile])