ruby-on-rails - 使用 Devise 在 Rails 3.1 中嵌套注册数据

标签 ruby-on-rails ruby

再次问好,stackoverflow 社区!

我正在使用 Rails 编写一个简单的博客系统,我正在使用 Devise 进行身份验证。

我进行了基本的电子邮件/密码注册,现在我已经建立了用户表(由设计生成的基本表)和 UserData 表的一对一连接,其中包含用户名、权限、关于等等。

这很简单 - 用户表是 100% 设计的 Vanilla ,并且有一个 UserData。 用户数据属于用户。

我尝试扩展 Devise 生成的注册表单,这样用户不仅可以输入他的电子邮件和密码,还可以输入他想要的用户名。 这样,在发送表单时,如果表单字段的名称是正确的(嵌套哈希的正确结构,例如用户电子邮件的“email”和用户所需名称的“UserData[name]” ),新用户会自动创建,相应的 UserData 条目应该也由 Rails 自动创建,对吗?

现在,我遇到了一个很大的问题,UserData[name] 字段根本没有出现... 这是我遇到问题的文件...

new.html.erb

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>

  <div><%= f.label :email %><br />
<%= f.email_field :email %></div>


#This is the tidbit that doesn't work
<%= f.fields_for "UserData" do |ud_f| %>
  <%= ud_f.label "username" %>
  <%= ud_f.text_field :name %>
<% end %>

  <div><%= f.label :password %><br />
  <%= f.password_field :password %></div>

<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>

<div><%= f.submit "Sign up" %></div>
<% end %>

<%= render :partial => "devise/shared/links" %>

我已经找了好几个小时的答案,但无济于事。如果我故意在 fields_for block 中拼错单词“UserData”,它会打印出该字段。这很奇怪,我不知道是什么让那个字段消失了......

如果能提供一点帮助,我将不胜感激! 谢谢你的时间! :)

编辑 1+2:

经过一番折腾之后,我覆盖了 devise 的默认注册 Controller 并创建了我自己的注册 Controller 。我已经按照 timbrandes 的建议编辑了设计路线来调用我的自定义 Controller ,但我似乎无法在我的 Controller 中访问@user。这是我到目前为止的代码...

class RegistrationsController < Devise::RegistrationsController
  def new
   resource = build_resource({})
   resource.UserData = UserData.new
   respond_with resource
  end

  def create
    logger.debug "\n\n\nIN CREATE\n\n\n\n"
    logger.debug params.to_json
    super
  end

  def update
    super
  end
end

最佳答案

好吧,很多时间过去了,但我最终通过废弃并重新编写我的大部分 Devise 代码让它工作。老实说,重写并没有那么多,现在效果很好。

对于任何 future 浏览此(有点困惑)问答的开发人员,我能给您的唯一建议是确保编写结构化表单代码,尤其是对于嵌套资源。这是我当前有效的 registrations_controller.rb:

class RegistrationsController < Devise::RegistrationsController
  def new
    resource = build_resource({})
    resource.build_user_data
    respond_with resource
  end

  def create
    resource = build_resource(params[:user])

    if(resource.save)
      sign_in(resource_name, resource)
      respond_with resource, :location => after_sign_up_path_for(resource)
    else
      render :action => "new"
    end


  end

  def update
    super
  end
end 

以及注册表的 .erb:

<div class="form-box">  

    <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
      <%= devise_error_messages! %>

      <div><%= f.label :email %>
      <%= f.email_field :email %></div>

        <%= f.fields_for(:user_data)  do |udf| %>
          <%= udf.label :name, "Desired user name" %>
          <%= udf.text_field :name %>

          <%= udf.label :roles, "Privileges"%>
          <% for role in UserData::ROLES %>
               <%= check_box_tag "user[user_data_attributes][roles][]" , role, resource.user_data.roles.include?(role) %>
               <%=h role.humanize %><br />
          <% end %>
          <%= hidden_field_tag "user[user_data_attributes][roles][]" %>

        <% end %>

      <div><%= f.label :password %>
      <%= f.password_field :password %></div>

      <div><%= f.label :password_confirmation %>
      <%= f.password_field :password_confirmation %></div>

      <div><%= f.submit "Sign up" %></div>
    <% end %>

    <%= render :partial => "devise/shared/links" %>

</div>

关于ruby-on-rails - 使用 Devise 在 Rails 3.1 中嵌套注册数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8811831/

相关文章:

ruby-on-rails - 在登录或注册后设计重定向回原始位置?

ruby-on-rails - 具有动态哈希的 Rails update_attributes

ruby - ruby 中的版本排序(使用 alphas、betas 等)

JQuery UI Accordion 标题未正确呈现

ruby-on-rails - 如何使用 Rails 4 在 savon 2.7 中传递安全 header

mysql - Rails mysql 删除重复的元组

ruby - Ruby 1.8 的 Shellwords.shellescape 实现

ruby - 你怎么称呼 Ruby 中的 -> 运算符?

ruby &&= 边缘案例

ruby-on-rails - 为什么人们把像 `gem "守卫 "` in their ` :development` group in Gemfiles 这样的东西