让 Devise 响应 html 和 json?
Making Devise respond to both html and json?
我正在开发一个需要同时具有网站和 api 的应用程序,并且我正在为此实施通用的 Devise 身份验证。为了实现这个要求,我重写了 Devise Registrations Controller 以响应 html 和 json。对于 json 我希望控制器 return 用户数据并且我能够实现这个,但是对于 html 我想使用登录并重定向到根路径的原始设计行为.
注册控制器的代码是:
class RegistrationsController < Devise::RegistrationsController
def create
@user = User.create(user_params)
respond_to do |format|
format.html {
@user.save ? (super) : (render :new)
}
format.json {
@user.save ? (render :json => {:state => {:code => 0}, :data => @user }) :
(render :json => {:state => {:code => 1, :messages => @user.errors.full_messages} })
}
end
end
private
def user_params
params.require(:user).permit(:email, :password)
end
end
使用这个控制器我得到一个验证错误电子邮件已经被接收但是当我检查我的日志时它显示用户已经被创建。
谁能告诉我我在做什么错误?我只希望我的控制器在 html 请求的情况下回退到原始设计功能。
问题是当您使用 HTML 时,您通过 运行同时 @user = User.create(user_params)
和 super
创建了用户两次。我将第一行代码移动为 JSON 格式,并将 HTML 移动为仅 运行 super
.
class RegistrationsController < Devise::RegistrationsController
def create
respond_to do |format|
format.html {
super
}
format.json {
@user = User.create(user_params)
@user.save ? (render :json => {:state => {:code => 0}, :data => @user }) :
(render :json => {:state => {:code => 1, :messages => @user.errors.full_messages} })
}
end
end
private
def user_params
params.require(:user).permit(:email, :password)
end
end
这是代码的工作版本(我自己在本地测试)。
您的控制器应如下所示:
def create
@user = User.create(user_params)
respond_to do |format|
format.html {
@user.save ? (render @user) : (render 'layouts/application')
}
format.json {
@user.save ? (render :json => {:state => {:code => 0}, :data => @user }) :
(render :json => {:state => {:code => 1, :messages => @user.errors.full_messages} })
}
end
end
添加 _user
部分 app/views/users/_user.html.erb
:
<p>
<%= @user.email %>
<%= @user.created_at %>
<%= @user.updated_at %>
</p>
因此,变化很小。进行这些更改后,您的 RegistrationsController#create
操作将成功用于 HTML 格式。
我正在开发一个需要同时具有网站和 api 的应用程序,并且我正在为此实施通用的 Devise 身份验证。为了实现这个要求,我重写了 Devise Registrations Controller 以响应 html 和 json。对于 json 我希望控制器 return 用户数据并且我能够实现这个,但是对于 html 我想使用登录并重定向到根路径的原始设计行为.
注册控制器的代码是:
class RegistrationsController < Devise::RegistrationsController
def create
@user = User.create(user_params)
respond_to do |format|
format.html {
@user.save ? (super) : (render :new)
}
format.json {
@user.save ? (render :json => {:state => {:code => 0}, :data => @user }) :
(render :json => {:state => {:code => 1, :messages => @user.errors.full_messages} })
}
end
end
private
def user_params
params.require(:user).permit(:email, :password)
end
end
使用这个控制器我得到一个验证错误电子邮件已经被接收但是当我检查我的日志时它显示用户已经被创建。
谁能告诉我我在做什么错误?我只希望我的控制器在 html 请求的情况下回退到原始设计功能。
问题是当您使用 HTML 时,您通过 运行同时 @user = User.create(user_params)
和 super
创建了用户两次。我将第一行代码移动为 JSON 格式,并将 HTML 移动为仅 运行 super
.
class RegistrationsController < Devise::RegistrationsController
def create
respond_to do |format|
format.html {
super
}
format.json {
@user = User.create(user_params)
@user.save ? (render :json => {:state => {:code => 0}, :data => @user }) :
(render :json => {:state => {:code => 1, :messages => @user.errors.full_messages} })
}
end
end
private
def user_params
params.require(:user).permit(:email, :password)
end
end
这是代码的工作版本(我自己在本地测试)。 您的控制器应如下所示:
def create
@user = User.create(user_params)
respond_to do |format|
format.html {
@user.save ? (render @user) : (render 'layouts/application')
}
format.json {
@user.save ? (render :json => {:state => {:code => 0}, :data => @user }) :
(render :json => {:state => {:code => 1, :messages => @user.errors.full_messages} })
}
end
end
添加 _user
部分 app/views/users/_user.html.erb
:
<p>
<%= @user.email %>
<%= @user.created_at %>
<%= @user.updated_at %>
</p>
因此,变化很小。进行这些更改后,您的 RegistrationsController#create
操作将成功用于 HTML 格式。