如何在rails 4.2上的ruby中显示嵌套表单属性?

时间:2015-02-06 17:04:56

标签: ruby-on-rails devise

我正在使用devise,我为用户信息(用户名,名字,姓氏,地址等)构建了另一个表。我想要做的是当用户点击他的个人资料设置(用户模型 - > edit.html.erb视图)以显示user_info表中属性的输入字段时。

class User < ActiveRecord::Base

  has_one  :user_info

class UserInfo < ActiveRecord::Base

  belongs_to :user

我的表格似乎是这样的:

<%= form_for(@user) do |f| %>
    <%= f.label :username %>
    <%= f.text_field :username, :placeholder => "Enter username",

    <%= f.label :email %>
    <%= f.text_field :email, :placeholder => "Enter email" %>

和控制器

def edit
  @user = User.find(params[:id])
  @user_info = current_user.user_info
end

当然这不起作用,因为username不是用户的属性,而是user_info表。如果我决定打印它,@ user.user_info.username可以工作,但如果我想显示并保存特定嵌套表单的字段呢?大多数SO回复都提到了如何使用嵌套表单的属性呈现部分,但我希望能够根据需要在我想要的地方打印其中的一个或两个。

1 个答案:

答案 0 :(得分:0)

您可以使用相同的表User,并覆盖Devise。

  1. 将您的信息迁移到您的用户表

    rails g migration add_username_to_users username:string

    rake db:migrate

  2. 为Devise生成视图

    rails g devise:views

  3. 将参数添加到Devise

  4.   

    在你的application_controller.rb

    before_action :configure_permitted_parameters, if: :devise_controller?
    
    protected
    
      def configure_permitted_parameters
        devise_parameter_sanitizer.for(:sign_up) do |u| 
         u.permit(:username,
                  :email, 
                  :password,
                  :password_confirmation,
                  :remember_me) }
       end
    
       devise_parameter_sanitizer.for(:account_update) do |u| 
         u.permit(:username, 
                  :email, 
                  :password, 
                  :password_confirmation, 
                  :current_password) }
       end
    
      end
    
    1. 修改设计视图
    2.   

      在/views/registrations/edit.html.erb和/views/registrations/new.html.erb

      中添加字段
      <%= f.label :username %>
      <%= f.input :username %>