Authority gem gives 'undefined method' - ruby-on-rails

I'm getting undefined method 'authorize_actions_for' in the controller when using rails-api with the Authority gem. Any ideas what I need to include? Here's my code:
Gemfile:
...
gem 'authority', '~> 2.9.0'
gem 'rails-api', '~> 0.1.0'
...
app/authorizers/session_authorizer.rb:
class SessionAuthorizer < ApplicationAuthorizer
def deletable_by?(user)
user.sessions.include?(resource)
end
end
app/controllers/v1/sessions_controller.rb:
class V1::SessionsController < ApplicationController
authorize_actions_for Session
...
end

Include Authority::Controller
As we discussed on Github, authorize_actions_for is defined in Authority::Controller.
In a normal Rails app, that module gets included into ActionController::Base by Authority's railtie.rb. Apparently the railtie isn't being required when using rails-api (maybe the Rails constant isn't defined?).
You can include the appropriate module yourself, though:
class ApplicationController < ActionController::Base
include Authority::Controller
end

Related

Using rails_admin with rails_api

I originally posted this as an issue on rails_api GitHub, but am now posting it here due to inactivity.
I'm trying to use rails_admin with a Rails 5 API application. I included extra ActionController modules up to the point that I can either have a functioning rails_admin panel or working API requests. The issue seems to be that rails_admin depends on ActionView::Layouts, which after included causes issues for API requests.
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'
I configured my application to use ActionDispatch::Flash:
module MyApp
class Application < Rails::Application
...
config.middleware.use ActionDispatch::Flash
end
end
I configured extra modules for 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 ActionView::Layouts
end
With these changes the Rails Admin dashboard seems to run fine. However, when I'm trying to access the JSON resources in my application, the following error is thrown:
Error:
BookingsControllerTest#test_should_get_index:
ActionView::MissingTemplate: Missing template bookings/index, application/index with {:locale=>[:en], :formats=>[:json], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :haml]}. Searched in:
* "/Users/richard/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/bundler/gems/rails_admin-355dc80f8a20/app/views"
The test code (also tried adding format: :json):
class BookingsControllerTest < ActionController::TestCase
test 'should get index' do
get :index
assert_response :success
end
end
This is the controller code:
class BookingsController < ApplicationController
def index
#bookings = find_bookings
render json: #bookings, include: ['customer', 'client'], meta: meta
end
end
This only happens after I include the ActionView::Layouts module in the top level ActionController::API class to support Rails Admin.
If I were you, I try isolate API and RailsAdmin controllers. I think this must work:
class ApplicationController < ActionController::API
include Knock::Authenticatable
include Pundit
end
class RailsAdminCustomController < ApplicationController
# RailsAdmin support
include AbstractController::Helpers
include ActionController::Flash
include ActionController::RequestForgeryProtection
include ActionController::MimeResponds
include ActionController::HttpAuthentication::Basic::ControllerMethods
include ActionView::Layouts
end
In config/initializers/rails_admin.rb
RailsAdmin.config do |config|
# other config stuff ...
config.parent_controller = '::RailsAdminCustomController'
end
Just check the RailsAdmin::ApplicationController here, and the config settings here.
As of v1.0.0 (released September 2016), Rails Admin now supports Rails 5 API-mode straight out-of-the-box. The gem itself injects the missing middleware to render its views and there is no extra configuration required.
Links:
Using Rails Admin with Rails 5 API application
CHANGELOG
You should have a json view file in this location bookings/index.json.jbuilder
And inside this file something like
bookings/index.json.jbuilder
json.name #bookings.name
json.date #bookings.date
This is another template missing
application/index
but really don't know you app completely. So maybe that's the application layout you implemented using ActionView::Layouts. In that case is asking you to implement a layout page file in the location application/index.
NOTE: Those two file inside the views folder.

Making Jbuilder work with Rails 5 API Mode

I want to use Jbuilder with Rails 5.0.0.beta1.1 in API mode. Out of the box, it doesn't work, even when creating the app/views directory.
For example, I have:
# app/controllers/tests_controller.rb
class TestsController < ApplicationController
# The requests gets inside the action
def test
end
end
# app/views/tests/test.json.jbuilder
json.test "It works!"
The error I'm getting is
No template found for TestsController#test, rendering head :no_content
I guess I have to change some things in the config files. What do I have to do?
Doing an explicit render from the controller like this works:
render 'controller_name/action.json.jbuilder'
With API mode.
You need include module like bellow
class ApplicationController < ActionController::API
include ActionController::ImplicitRender # if you need render .jbuilder
include ActionView::Layouts # if you need layout for .jbuilder
end
I got the same error, but in my case I had simply forgotten to add the jbuilder gem in the Gemfile:
gem 'jbuilder', '~> 2.5'

Uninitialized constant of gem

I've installed JWT gem - https://github.com/progrium/ruby-jwt
There is gem 'jwt' in Gemfile, of course. Inspite on that, I have the error of
uninitialized constant HomeController::JWT
in HomeController
class HomeController < ApplicationController
def method1
#jwt_token = JWT.encode({.... })
end
end
I believe you need a require 'jwt'.
HTH

Ruby require directive causes an error

Trying to create a simple flickr application using Ruby on Rails 3.2.3, I faced a problem. First I installed a gem called flickraw
sudo gem install flickraw
Then I tried to use it
require 'rubygems'
require 'flickraw'
class HomeController < ApplicationController
def index
end
def index2
end
def index3
end
end
And I got an error:
LoadError in HomeController#index
cannot load such file -- flickraw
Any suggestions?
You should not require gems from the controller. You should just add flickraw to your Gemfile
gem "flickraw"

uninitialized constant ApplicationController::Bitly

I have the bitly gem installed and am setting it up in my ApplicationController to use the API for version 3, but it is throwing the above error. Here is the beginning of my application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery
Bitly.use_api_version_3
before_filter { #cart = find_or_create_cart_from_session }
before_filter { #bitly = Bitly.new('myusername', 'XXXXXX_API_KEY_XXXXX') }
You say you have the Gem installed, but do you have it included in your Gemfile? If the Gem isn't in your Gemfile your application won't find it, which will lead to uninitialized constant errors.

Resources