Making Jbuilder work with Rails 5 API Mode - ruby-on-rails

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'

Related

Render a view in Rails 5 API

I generated an API-only rails app with Rails 5 via rails new <application-name> --api. I've decided I want to include a view for testing some things and am having issues getting a view to load.
I created a users/index.html.erb file with some text and my controller is now simply def index; end but there is nothing appearing when I hit the /users URL. I also tried commenting out the # config.api_only = true in config/application.rb but that didn't affect anything. Any suggestions on how to proceed?
You don't need to uncomment config.api_only = true for this purpose, just inherit your controller from ActionController::Base, or do it in your ApplicationController (default for common rails generation).
Code:
For this controller only YourController < ActionController::Base
For all apllication ApplicationController < ActionController::Base
this is from the ActionController::Metal docs https://apidock.com/rails/ActionController/Metal
it says:
ActionController::Metal by default provides no utilities for rendering >views, partials, or other responses aside from explicitly calling of >response_body=, content_type=, and status=. To add the render helpers >you’re used to having in a normal controller, you can do the following:
class HelloController < ActionController::Metal
include AbstractController::Rendering
include ActionView::Layouts
append_view_path "#{Rails.root}/app/views"
def index
render "hello/index"
end
end
So I've tried it myself and adding just by adding the two modules actually work just fine when using it for ActionController::API

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.

Authority gem gives 'undefined method'

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

Auto_link with rails_autolink gem - undefined method

I'm trying to use the rails_autolink gem.
As usual, I added the gem declaration to my gemfile:
gem 'rails_autolink'
Then ran "bundle install", restarted my rails local server and
Then I added to my posts_controller the require before the class declaration
require 'rails_autolink'
class PostsController < ApplicationController
...
and used the auto_link method inside my create action
def create
#new_post = Post.new(params[:post])
if #new_post.content == ""
redirect_to posts_url
else
#new_post.content = auto_link(#new_post.content)
... #respond_to and save methods
end
end
end #end of my post controller
The thing is that when I try to create a post I have a undefined method on the auto_link method, any idea why ? Is it specific to the gem or is it because something else ?
This is a view helper which you're trying to use in a controller
#new_post.content = view_context.auto_link(#new_post.content)
In any other places you can use: ActionController::Base.helpers.auto_link(text)
I don't believe you need the namespacing. Try it again simply using:
auto_link(#new_post.content)

Loading .coffee files via a view in Rails

My controller is as follows:
class CommentLoaderController < ApplicationController
respond_to :js
def show
puts 'here'
#client_id = params[:id]
respond_with #client_id
end
end
It loads a .js file which has some .erb markup in it. I'd like to load a CoffeeScript file, compiled to JS on the fly. Is this possible with Rails 3?
I think this blog post that one of my colleagues wrote today might help
http://www.storm-consultancy.com/blog/development/random-bits/todays-gotcha-when-coffeescript-templates-in-rails-work-in-development-but-not-production/
It turns out that Rails won’t compile CoffeeScript templates by
default, but you can install the Coffeebean gem and it magically
works.

Resources