gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:57:15 24 4
gpt4 key购买 nike

再次问好,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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com