【问题标题】:Making Devise respond to both html and json?让 Devise 同时响应 html 和 json?
【发布时间】:2015-08-18 11:31:04
【问题描述】:

我正在开发一个需要同时具有网站和 api 的应用程序,并且我正在为此实施通用的 Devise 身份验证。为了实现这个要求,我重写了设计注册控制器来响应 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 请求的情况下回退到原始设计功能。

【问题讨论】:

标签: ruby-on-rails devise


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 2020-09-16
      相关资源
      最近更新 更多