【问题标题】:Rails 4 and Devise: nested attributes validations not workingRails 4 和 Devise:嵌套属性验证不起作用
【发布时间】:2015-07-16 14:14:56
【问题描述】:

我在我的 rails 4 应用程序中使用 Devise。我有一个成员模型(用于设计)和一个包含每个成员的所有个人资料信息的用户模型。成员接受用户的嵌套属性。请参阅下面的表格以获取新注册以及我的 routes.rb 文件中的自定义路由。

我的问题是——除了验证用户属性外,一切正常。如果我将名字和姓氏留空,则它会验证(但会像这样崩溃:

但 Member(设计模型)的所有其他验证都有效 - 它们最终在 /members 页面上显示错误消息。我不确定发生了什么 - 不应该设计显示无效嵌套属性的错误消息吗?

class Members::RegistrationsController < Devise::RegistrationsController

    # GET /resource/sign_up
     def new
        build_resource({})
        self.resource.user = User.new
        respond_with self.resource
     end

    # POST /resource
    def create
        super
        resource.user.ip_address = request.remote_ip
        resource.user.email = resource.email
        resource.user.save!
    end

    private

    def sign_up_params
        allow = [:provider, :uid, :email, :password, :password_confirmation, user_attributes: [:member_id, :email, :first_name, :last_name, :institution, :city, :country, :job_title, :about, :tag_list, :picture, :ip_address]]
        params.require(resource_name).permit(allow)
    end

  end

会员.rb

  class Member < ActiveRecord::Base
      devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :trackable

      has_one :user, dependent: :destroy, autosave: true

      accepts_nested_attributes_for :user

  end

用户.rb

  class User < ActiveRecord::Base

       belongs_to :member

       validates :first_name, presence: true

       validates :last_name, presence: true

  end

在我的 routes.rb 中

   devise_for :members, controllers: {registrations: 'members/registrations',
                                      omniauth_callbacks: 'members/omniauth_callbacks',
                                      sessions: 'members/sessions' }

在我的会员/registrations/new.html.erb

       <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), html: { role: "form" }) do |f| %>

          <%= f.fields_for(:user) do |user_fields| %>

          <%= user_fields.text_field :first_name, autofocus: true, class: 'form-control', :placeholder => "First name" %>

          <%= user_fields.text_field :last_name, class: 'form-control', :placeholder => "Last name" %>

           <% end %>

       <%= f.email_field :email, autofocus: true, class: "form-control", :placeholder => "Email" %>

       <%= f.password_field :password, class: "form-control", :placeholder => "Password" %>

       <%= f.submit t('.sign_up', :default => "Sign up"), class: "btn btn-danger" %>

       <% end %>

这是日志

   Started POST "/members" for ::1 at 2015-07-16 15:18:54 +0100
   Processing by Members::RegistrationsController#create as HTML
   Parameters: {"utf8"=>"✓",          "authenticity_token"=>"sIxK1PTvrxNHUBdDXAtKFLLG27FvqypQ3mUvo398tHOMomi1S3I2o3vBM GwrF6PVN1NFBR5vnr8ezKP6XnMzqw==", "member"=>{"user_attributes"=>{"first_name"=>"", "last_name"=>""}, "email"=>"slfwalsh@gmail.com", "password"=>"[FILTERED]"}, "commit"=>"Sign up"}
   (0.2ms)  begin transaction
   Member Exists (0.3ms)  SELECT  1 AS one FROM "members" WHERE "members"."email" = 'slfwalsh@gmail.com' LIMIT 1
  (0.1ms)  rollback transaction
  Rendered devise/shared/_links.erb (9.9ms)
    Rendered members/registrations/new.html.erb within layouts/static_home_page (19.8ms)
    Rendered layouts/_static_login_header.html.erb (4.1ms)
     (0.1ms)  begin transaction
    (0.1ms)  rollback transaction
    Completed 422 Unprocessable Entity in 1499ms

【问题讨论】:

  • create 方法中尝试resource.user.save 而不是resource.user.save!
  • Pavan - 太棒了。你是对的。让它成为答案,我将标记为正确。还请给出一行解释为什么这对新手(像我一样)有效

标签: ruby-on-rails ruby devise


【解决方案1】:

您看到该页面的原因是save! 触发验证错误如果任何属性的验证失败并且这些错误显示在页。另一方面,save 显示验证错误,而只是如果任何验证失败,则取消保存交易。像下面这样更改您的创建方法应该可以解决您的问题。

def create
  super
  resource.user.ip_address = request.remote_ip
  resource.user.email = resource.email
  resource.user.save
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多