我决定在通过Devise创建用户模型后为用户名添加一列。我意识到我需要使其可访问,以便在用户提交新用户表单时数据库将正确更新。然后我意识到,由于这是Rails 4,我必须通过控制器来做到这一点,并且Devise不会为我的用户模型提供控制器。所以我按照Devise页面上的说明创建了自己的自定义控制器并更改了使用它的路径。这是我的自定义控制器,我放在apps/controllers/users
:
class Users::RegistrationsController < Devise::RegistrationsController
def new
super
end
def create
super
end
def edit
super
end
private
def user_params
params.require(:user).permit(:username, :email, :password, :password_confirmation)
end
end
然后我用{/ p>修改了routes.db
devise_for :users, :controllers => { :registrations => "users/registrations" }
。
我的表单如下:
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => {:class => 'form-horizontal'}) do |f| %>
<%= devise_error_messages! %>
<div class="control-group">
<div class="control-label">
<%= f.label :username %>
</div>
<div class="controls">
<%= f.text_field :username %>
</div>
</div>
<div class="control-group">
<div class="control-label">
<%= f.label :email %>
</div>
<div class="controls">
<%= f.email_field :email, :autofocus => true %>
</div>
</div>
<div class="control-group">
<div class="control-label">
<%= f.label :password %>
</div>
<div class="controls">
<%= f.password_field :password %>
</div>
</div>
<div class="control-group">
<div class="control-label">
<%= f.label :password_confirmation %>
</div>
<div class="controls">
<%= f.password_field :password_confirmation %>
</div>
</div>
<div class="control-group">
<div class="controls">
<%= f.submit "Sign up" %>
</div>
</div>
<div class="control-group">
<div class="controls">
Already have an account? <%= render "devise/shared/links" %>
</div>
</div>
<% end %>
我按照设计页面上的说明复制了/devise/registrations' views to
/ users / registrations。
我没有收到任何错误,但无论出于什么原因,当我测试表单时,它会将所有内容写入数据库,但用户名除外。我可以进入rails控制台并使用用户名创建用户,但表单不会发生这种情况。我的目标是让application.html.erb
中的以下代码行工作:
Logged in as <%= current_user.username %>
但它永远不会起作用,失败会反映在控制台中,控制台会将用户名显示为“nil”。
任何人都知道我做错了什么?这个错误在哪里?我的Post模型遇到了类似的问题,某些事情没有更新,但我能够通过更改PostController中可访问的属性来修复它。谢谢你的帮助!
答案 0 :(得分:1)
查看registration controller of devise,看起来它没有使用user_params
。尝试将user_params
更改为sign_up_params
。