包括时
gem 'strong_parameters'
gem 'rails-api'
Run Code Online (Sandbox Code Playgroud)
在一起的我Gemfile,呼吁params.require像
private
def user_params
params.require(:user).permit(:first_name, :last_name)
end
Run Code Online (Sandbox Code Playgroud)
在require()通话中出现以下错误失败.
TypeError:
can't convert Symbol into String
Run Code Online (Sandbox Code Playgroud)
回溯显示strong_parameters' ActionController::StrongParameters' require()方法永远不会被击中.
我想使用离子框架为fb登录构建一个rails api.直到现在我已成功创建了一个网络基础应用程序,并且它已成功通过Facebook进行身份验证.
现在我想用基于离子的应用程序做同样的事情.
有问题吗?
无法在网上找到关于它的任何内容,也没有找到任何带离子的导轨的github项目(fb登录).
我目前的代码:
控制器:
class SessionsController < ApplicationController
def create
user = User.from_omniauth(env["omniauth.auth"])
session[:user_id] = user.id
redirect_to root_url
end
def destroy
session[:user_id] = nil
redirect_to root_url
end
end
Run Code Online (Sandbox Code Playgroud)
模型:
class User < ActiveRecord::Base
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_initialize do |user|
user.provider = auth.provider
user.uid = auth.uid
user.name = auth.info.name
user.oauth_token = auth.credentials.token
user.oauth_expires_at = Time.at(auth.credentials.expires_at)
user.save!
end
end
end
Run Code Online (Sandbox Code Playgroud)
初始化:
OmniAuth.config.logger = Rails.logger
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, "123", "abc"
end
Run Code Online (Sandbox Code Playgroud) 我正在开发 Rails RESTful API,并在某些端点上设置了版本控制功能。我有一个类ApiVersion,负责根据初始化时传递给它的参数确定要渲染哪些控制器。
类定义如下:
class ApiVersion
attr_reader :version, :default
def initialize(version, default = false)
@version = version
@default = default
end
# check whether version is specified or is default
def matches?(request)
check_headers(request.headers) || default
end
private
def check_headers(headers)
# check version from Accept headers; expect custom media type 'suits'
accept = headers[:accept]
accept&.include?("application/vnd.suits.#{version}+json")
end
end
Run Code Online (Sandbox Code Playgroud)
这些请求工作得很好,但是当我运行时,rubocop -A我收到一条错误消息:
Style/OptionalBooleanParameter: Use keyword arguments when defining method with boolean argument.
def initialize(version, default = false)
Run Code Online (Sandbox Code Playgroud)
我在互联网上搜索了如何修复此类错误并得到了一些有趣的想法,但这些想法不适用于我的情况。例如,我发现一篇文章说我应该交替def …
如果有人可以解决一些问题,我会非常感激,因为我对这个问题毫无头绪.基本上我正在尝试使用仅在rails-api gem 之上构建的JSON only rails rest api app来完成设计认证.
我已经实现了如下所述的处理Sessions和Registrations处理.
class ApplicationController < ActionController::API
include ActionController::MimeResponds
end
Run Code Online (Sandbox Code Playgroud)
class SessionsController < Devise::SessionsController
prepend_before_filter :require_no_authentication, :only => [:create ]
before_filter :ensure_params_exist
def create
build_resource
resource = User.find_for_database_authentication(:email => params[:user][:email])
return invalid_login_attempt unless resource
if resource.valid_password?(params[:user][:password])
sign_in("user", resource)
render :json=> {:success=>true, :auth_token=>resource.authentication_token, :email=>resource.email}
return
end
invalid_login_attempt
end
def destroy
sign_out(resource_name)
end
protected
def ensure_params_exist
return unless params[:user][:email].blank?
render :json=>{:success=>false, :message=>"missing login email parameter"}, :status=>422
end
def invalid_login_attempt
warden.custom_failure! …Run Code Online (Sandbox Code Playgroud) 我们在Rails应用程序中使用active_model_serializers - 0.8.1.
该应用程序有一些API特定的控制器继承自ActionController :: Metal,其方式类似于rails-api的ActionController :: API.
好吧,我们只想将ActiveModel :: Serializers用于上面提到的API控制器.
这可能吗,怎么样?
注意:
如文档中所述,通过替换可以明确避免使用序列化程序
render :json
有:
render :json => @your_object.to_json
我们正在寻求比上述解决方案更优雅的解决方案.
谢谢.
我在我的json api项目中使用rails-api gem,为此我使用了活动模型序列化程序gem来序列化我的对象,但是有些对象没有使用活动模型序列化程序进行序列化.
我的serializers文件夹里面有一个MessageSerializer
class MessageSerializer < ActiveModel::Serializer
attributes :id, :sender_id, :recipient_id, :sender_type, :subj, :body, :status, :sender
def sender
object.user.try('username')
end
end
Run Code Online (Sandbox Code Playgroud)
我的消息控制器如下
class Api::MessagesController < Api::BaseController
def index
@messages = current_user.incoming_messages
render json: @messages, serializer: MessageSerializer
end
end
Run Code Online (Sandbox Code Playgroud)
但问题是抛出到客户端的序列化对象包含消息模型中的所有字段,即; 它也包含created_at,updated_at字段.
好像它不使用序列化器.
可能出了什么问题?我搜索了很多关于它但没有发现任何帮助我的帖子.
谢谢
在我的config/application.rb文件中,我有这个代码,
config.action_dispatch.default_headers = {
'Access-Control-Allow-Origin' => '*',
'Access-Control-Request-Method' => 'GET, PATCH, PUT, POST, OPTIONS, DELETE'
}
Run Code Online (Sandbox Code Playgroud)
但是这不允许我向我的服务器上的路由发送帖子请求
Safari提供此错误:
http://localhost:3000/studentsFailed to load resource: the server responded with a status of 404 (Not Found)
http://localhost:3000/studentsFailed to load resource: Origin http://localhost:4200 is not allowed by Access-Control-Allow-Origin.
localhost:1XMLHttpRequest cannot load http://localhost:3000/students. Origin http://localhost:4200 is not allowed by Access-Control-Allow-Origi
Run Code Online (Sandbox Code Playgroud)
在我的Rails服务器控制台中:
Started OPTIONS "/students" for ::1 at 2015-03-28 21:00:45 -0500
ActionController::RoutingError (No route matches [OPTIONS] "/students"):
Run Code Online (Sandbox Code Playgroud) 我正在构建一个关于如何为一些学生构建API的简单rails指南,我正在构建它而没有respond_to和respond_with,因为我只是想看看我是否可以在不使用gem的情况下构建api.这就是我所拥有的和我的测试通过:
控制器:
class Api::V1::SuyasController < ApplicationController
def index
render json: Suya.all
end
def create
render json: Suya.create(suyas_params)
end
private
def suyas_params
params.require(:suya).permit(:meat, :spicy)
end
end
Run Code Online (Sandbox Code Playgroud)
路线:
Rails.application.routes.draw do
namespace :api do
namespace :v1 do
resources :vendors
resources :suyas
end
end
end
Run Code Online (Sandbox Code Playgroud)
测试:
require 'test_helper'
class Api::V1::SuyasControllerTest < ActionController::TestCase
test "index can get all the suyas" do
Suya.create(meat: "beef", spicy: true)
Suya.create(meat: "kidney", spicy: false)
get :index
suyas = JSON.parse(response.body)
assert_equal "beef", suyas[0]["meat"]
assert_equal true, suyas[0]["spicy"]
assert_equal "kidney", suyas[1]["meat"]
assert_equal false, …Run Code Online (Sandbox Code Playgroud) 我一直在阅读REST API版本的所有方法.在几乎所有实现中,控制器和视图都是版本化的,但模型不是.
为了给出rails示例,控制器组织为:
# app/controllers/api/v1/events_controller.rb
class Api::V1::EventsController < Api::ApiController
end
Run Code Online (Sandbox Code Playgroud)
相应的视图也放在不同版本的目录中.为什么我们没有版型号?是因为我们希望我们的模型(底层数据库模式)不随着API的发展而改变吗?当我在数据库中重命名列名并需要新模型来解释时会发生什么?
我最初在rails_api GitHub上发布了这个问题,但现在由于不活动而在此发布.
我正在尝试使用rails_adminRails 5 API应用程序.我添加了额外的ActionController模块,以至于我可以使用有效的rails_admin面板或工作API请求.问题似乎是rails_admin依赖于ActionView::Layouts,包含后会导致API请求出现问题.
的Gemfile:
gem 'rails', '>= 5.0.0.beta3', '< 5.1'
...
gem 'rack-pjax', github: 'afcapel/rack-pjax'
gem 'remotipart', github: 'mshibuya/remotipart'
gem 'kaminari', github: 'amatsuda/kaminari', branch: '0-17-stable'
gem 'rails_admin', github: 'sferik/rails_admin'
Run Code Online (Sandbox Code Playgroud)
我配置我的应用程序使用ActionDispatch::Flash:
module MyApp
class Application < Rails::Application
...
config.middleware.use ActionDispatch::Flash
end
end
Run Code Online (Sandbox Code Playgroud)
我为Rails API,ApplicationController 配置了额外的模块:
class ApplicationController < ActionController::API
include Knock::Authenticatable
include Pundit
# RailsAdmin support
include AbstractController::Helpers
include ActionController::Flash
include ActionController::RequestForgeryProtection
include ActionController::MimeResponds
include ActionController::HttpAuthentication::Basic::ControllerMethods
include …Run Code Online (Sandbox Code Playgroud) ruby-on-rails actionview rails-admin rails-api ruby-on-rails-5
rails-api ×10
ruby-on-rails ×10
ruby ×2
actionview ×1
ajax ×1
cors ×1
devise ×1
facebook ×1
omniauth ×1
rails-admin ×1
rest ×1
rubocop ×1
versioning ×1