标签: rails-api

Rails-api宝石分页

有没有办法使用rails-api gem API添加JSON分页?

我希望能够获取前50个用户,然后在另一个呼叫中从第50个用户开始,再获得50个用户.

像这样的东西: url.com/api/v1/users?start=50

ruby-on-rails rails-api

3
推荐指数
2
解决办法
2366
查看次数

Rails 中的模型资源命名与管道冲突

我正在使用 Rails 构建一个 API,其中有一些我可能想要用于管理目的的页面。我提供的其中一个模型被称为“an”,asset因为它就是这样的。

rake routes问题是,在使用和从 API 获取资产时,所有路由都正确显示,这很好,但当我尝试PUT更新资产时,它会失败,方法不允许。我尝试更改名称,Rails 与其他任何东西都很好。

如何在不重命名模型或使用别名路由的情况下解决此问题?

ruby-on-rails rails-api ruby-on-rails-4

3
推荐指数
1
解决办法
327
查看次数

Rails:用于多部分/表单数据的 ActionDispatch::Request.parameter_parsers

在我的 Rails API 中,我添加了一个初始化程序,它将把 JSON 输入的键从蛇形大小写更改为下划线分隔。就像这样:

ActionDispatch::Request.parameter_parsers[:json] = -> (raw_post) {
    data = ActiveSupport::JSON.decode(raw_post)
    data = {:_json => data} unless data.is_a?(Hash)

    data.deep_transform_keys!(&:underscore)
}
Run Code Online (Sandbox Code Playgroud)

现在,某些 API 将通过标头传递:content-type: multipart/form-data而不是application/json

我想对这样的 API 做同样的事情。即添加一个初始化程序来转换参数中键的大小写。

我尝试过ActionDispatch::Request.parameter_parsers[:form_data],但没有成功。

我怎样才能实现这个目标?

ruby-on-rails rails-api

3
推荐指数
1
解决办法
2881
查看次数

Rails API 应用程序的 CSRF 令牌

在 Rails API 应用程序中,我们没有现成的 CSRF 保护。特别是,不建议将访问令牌(例如 JWT)存储在 localStorage 中,建议存储在 cookie 中(带有 httpOnly 标志、SameSite 等)。但这一次我们很容易受到潜在的 CSRF 攻击。在全栈生成的 Rails 应用程序中,每次打开表单时都会生成并嵌入一个 CSRF 令牌。但是,我不知道也找不到任何我们如何在 Rails API 应用程序中使用令牌来防止 CSRF 的信息。我们有最佳实践吗?或者有人可以建议一种方法吗?我使用访问和刷新 JWT。

security ruby-on-rails csrf rails-api csrf-token

3
推荐指数
1
解决办法
2161
查看次数

为什么rails-api返回500内部服务器错误而不是404?

使用rails-api:

  def show
    render json: Room.find(params[:id])
  end
Run Code Online (Sandbox Code Playgroud)

这在找到资源时有效.但是寻找一个不存在的返回500错误.这不应该归还404吗?

> http --json GET chat.dev/api/v1/rooms/23
HTTP/1.1 500 Internal Server Error
Connection: close
Content-Type: text/plain; charset=utf-8
X-Request-Id: 4cd2ba9f-0f85-4530-9c0a-0ef427ac5b31
X-Runtime: 0.094633

ActiveRecord::RecordNotFound at /api/v1/rooms/23
================================================

> Couldn't find Room with id=23

app/controllers/api/v1/rooms_controller.rb, line 20
---------------------------------------------------

``` ruby
   15         #     render :json => {}, :status => :not_found
   16         #   end
   17         # end
   18   
   19         def show
>  20           render json: Room.find(params[:id])
   21         end
   22   
   23       end
   24   
   25     end    
Run Code Online (Sandbox Code Playgroud)

api ruby-on-rails http-status-code-404 rails-api

2
推荐指数
1
解决办法
3299
查看次数

测试 401 错误且未找到记录时 Rspec 挂起

我正在运行 Rails-api 的 Rails 4 API 上使用 RSpec 运行集成测试。我想看看如果将错误的电子邮件地址传递给登录控制器,我会得到 401 返回。

这是我的期望

it "should throw invalid login for user with invalid email" do
  post "/api/v1/users/sign_in", uname: "wrong_email@wrong.com", password: "12234"

  expect(response).to eq(401)

end
Run Code Online (Sandbox Code Playgroud)

在我的控制器中我有:

def create
  @user = User.find_by_email(params[:uname])
  if(@user && @user.valid_password?(params[:password]))
  ....
end
Run Code Online (Sandbox Code Playgroud)

这在浏览器中运行良好,我得到了 401 返回。但是当我运行 rspec 时,它只会挂起并且永远不会报告失败或通过,只是坐在那里没有错误。问题的症结似乎是 if(@user) 部分。如果我删除它,那么测试至少会运行。

我检查了 log/test.log,我可以在日志中看到Completed 401 Unauthorized in 14ms (Views: 0.2ms | ActiveRecord: 2.8ms) 。

更新

澄清一下,这是一个request spec. 我正在测试 API 的使用者是否会在电子邮件无效的情况下收到 401 响应。

rspec ruby-on-rails rails-api ruby-on-rails-4

2
推荐指数
1
解决办法
2490
查看次数

Rails - 设计devise_token_auth不发送确认电子邮件

我在项目(ruby'2.2.0',rails'4.2.3')上工作,它使用标准设计用户管理(用于网页)和devise_token_auth(用于服务的API部分).除非我,一切正常

include DeviseTokenAuth::Concerns::User
Run Code Online (Sandbox Code Playgroud)

在models/user.rb中.然后在用户注册后不发送确认电子邮件.

我很感激这个问题的解决方案.

我的models/user.rb:

class User < ActiveRecord::Base
  # Include devise modules.
  devise :invitable, :database_authenticatable, :registerable,
          :recoverable, :rememberable, :trackable, :validatable,
          :confirmable, :omniauthable

  include DeviseTokenAuth::Concerns::User

  enum role: [:user, :vip, :admin]
  after_initialize :set_default_role, :if => :new_record?

  def set_default_role
    self.role ||= :user
  end
end
Run Code Online (Sandbox Code Playgroud)

routes.rb中:

Rails.application.routes.draw do
  # standard devise routes available at /users
  # NOTE: make sure this comes first!!!
  devise_for :users

  # token auth routes available at /api/v1/auth
  namespace :api do
    scope :v1 do
      mount_devise_token_auth_for 'User', at: 'auth'
    end …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails devise access-token devise-confirmable rails-api

2
推荐指数
1
解决办法
1221
查看次数

如何在rails 5 api中获取请求标头cookie

我试图从控制器获取 cookie,但puts request.headers['Cookie']我的终端中没有显示任何内容。

我在 chrome 工具中查看详细信息:

在此输入图像描述

请问如何获取cookie?

编辑

请参阅标题响应的要点

ruby-on-rails rails-api ruby-on-rails-5

2
推荐指数
1
解决办法
4032
查看次数

为什么 devise sanitizer 返回空哈希

我正在编写一个仅 API 的 Rails 5 应用程序,并使用 devise-jwt (和 devise)gem 进行用户身份验证。我正在尝试在我的自定义registrations_controller 中配置强大的参数。在application_controller.rb

before_action :configure_permitted_parameters, if: :devise_controller?

def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name, :username, :email])
end
Run Code Online (Sandbox Code Playgroud)

并在registrations_controller.rb

def create
    build_resource(sign_up_params)
    resource.save
    #json response defined in application_controller.rb
    render_resource(resource)
end
Run Code Online (Sandbox Code Playgroud)

这是当我通过 Postman 向 API 发出 POST 请求时控制台的输出:

Parameters: {"first_name"=>"john", "last_name"=>"stones", "username"=>"johnstones", "email"=>"john@stones.com"}

params这是打印到控制台的输出:

<ActionController::Parameters {"first_name"=>"john", "last_name"=>"stones", "username"=>"johnstones", "email"=>"john@stones.com", "controller"=>"registrations", "action"=>"create"} permitted: false>

尽管有上述情况,当我这样做时,devise_parameter_sanitizer.sanitize(:sign_up)我得到一个空哈希,并且我前面提到的 POST 抛出了我为空白字段设置的验证错误。请帮我弄清楚我缺少什么,谢谢。

(导轨 5.2/设计 4.2)

ruby ruby-on-rails devise rails-api

1
推荐指数
1
解决办法
663
查看次数

在 Heroku 上部署的 Rails API 在开发时抛出内部服务器错误 (500)

我在 Heroku 上部署了 Rails API(Rails API 不是使用 创建的rails new <app-name> --api,而是一个 Rails 应用程序,我从中创建了一个 API)。

在 Heroku 上部署时,Rails API 不起作用并抛出内部服务器错误状态 500。

我尝试使用邮递员和浏览器访问我的 API,但我收到内部服务器错误的 JSON 输出。

上述 JSON 响应是发送请求的结果my-app-name.herokuapp.com/api/v1/foods

我应该提到的是,我尝试heroku run rails console查看我的数据库是否正确播种,并且我获得了我应该正确获得的所有数据。

heroku logs --tail在这里,我复制了尝试向上述网址发送请求后的结果:

2019-06-18T19:45:53.619745+00:00 heroku[web.1]: State changed from starting to up
2019-06-18T19:45:55.010890+00:00 app[web.1]: => Booting Puma
2019-06-18T19:45:55.010918+00:00 app[web.1]: => Rails 5.2.3 application starting in production
2019-06-18T19:45:55.010920+00:00 app[web.1]: => Run `rails server -h` for more startup options
2019-06-18T19:45:55.010922+00:00 app[web.1]: Puma starting in single mode... …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails heroku rails-api

1
推荐指数
1
解决办法
611
查看次数