我正在使用devise在我的应用程序中构建注册/身份验证系统。
查看了许多资源以向设计模型添加信息(例如用户名、传记、虚拟形象URL等)【资源包括Jaco Pretorius' websitethis (badly formed) SO questionand this SO question
一切都很好,很好——很管用。但我的问题是它保存到用户模型,根据database normalizationsalso referencing this SO question),它实际上应该保存到通过has_onebelongs_to连接的用户子模型。
到目前为止,我已经通过devise创建了一个User模型。我还通过UserProfile脚本创建了一个rails generate模型。
user.rb(供参考)

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :confirmable, :recoverable, :rememberable, :trackable, :validatable

  has_one :user_profile, dependent: :destroy
end

用户配置文件.rb
class UserProfile < ActiveRecord::Base
  belongs_to :user
end

timestamp_create_user_profiles.rb时间戳
class CreateUserProfiles < ActiveRecord::Migration
  def change
    create_table :user_profiles do |t|
      t.string :username, null: false
      t.string :biography, default: ""

      t.references :user, index: true, foreign_key: true

      t.timestamps null: false
    end
    add_index :user_profiles, [:user_id, :username]
  end
end

我现在的问题是,如何收集这两种模型的信息,并通过设计登记表确保它们最终都在正确的地方?
我看过有关创建状态机(AASMthe answer to this SO question的参考资料。我还看到了关于在同一主题上创建a wizard with WICKEDan article的信息。
这些对我的用例来说都太复杂了。有没有办法简单地把输入和设计分开,并确保最终在正确的地方?

最佳答案

我想,与其简单地评论一个让我得出最终答案的答案,不如把答案存档在这里,以防将来有人也试图找到这个答案:
我会假设你有我在上面所做的某种设置。
第一步是需要修改用户控制器以accept_nested_attributes_for配置文件引用,并向模型添加实用方法,以便在代码中请求时,应用程序可以检索生成的配置文件模型或生成一个配置文件模型。
用户模型最终看起来是这样的:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :confirmable, :recoverable, :rememberable, :trackable, :validatable

  has_one :user_profile, dependent: :destroy
  accepts_nested_attributes_for :user_profile

  def user_profile
    super || build_user_profile
  end
end

其次,您需要修改您的注册/帐户更新表单,以便能够将此辅助模型的属性传递到控制器中,并最终能够为父模型生成配置文件。
您可以使用f.fields_for来完成此操作。
在表单中添加以下内容:
<%= f.fields_for :user_profile do |user_profile_form| %>
 <%= user_profile_form.text_field :attribute %>
<% end %>

在我的具体案例中,一个例子是:
<%= f.fields_for :user_profile do |user_profile_form| %>
  <div class="form-group">
    <%= user_profile_form.text_field :username, class: "form-control", placeholder: "Username" %>
  </div>
<% end %>

最后,您需要告诉designe它应该接受这个新的参数散列并将其传递给模型。
如果您已经创建了自己的注册控制器和扩展设计,它应该类似于:
class RegistrationsController < Devise::RegistrationsController
  private
    def sign_up_params
      params.require(:user).permit(:email, :password, user_profile_attributes: :username)
    end
end

(当然,为您的特定用例进行适当的更改。)
如果您只是将designe清理方法添加到应用程序控制器中,它应该类似于:
class ApplicationController < ActionController::Base
  before_filter :configure_permitted_parameters, if: :devise_controller?

  protected
    def configure_permitted_parameters
      devise_parameter_sanitizer.for(:sign_up) {|u|
        u.permit(:email, :password, user_profile_attributes: :username)}
    end
end

(同样,对您的特定用例进行适当的更改。)
关于user_profile_attributes: :username的一个小提示:
注意,这当然是散列。如果您有多个要传入的属性,例如作为account_update(提示提示提示),则需要像这样传入它们。

关于ruby-on-rails - Rails-Devise-将配置文件信息添加到单独的表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36051782/

10-14 01:34