让Devise响应html和json?

时间:2015-08-17 20:25:35

标签: ruby-on-rails devise

我正在开发一个需要同时具有网站和api的应用程序,我正在为此实现一个共同的Devise身份验证。为了实现这个要求,我将重写Devise Registrations Controller以响应html和json。对于json,我希望控制器返回用户数据,我能够实现这一点,但对于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请求的情况下回退到原始设计功能。

2 个答案:

答案 0 :(得分:2)

问题是当您使用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 

答案 1 :(得分:0)

这是代码的工作版本(我自己在本地测试)。 您的控制器应该如下所示:

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格式。