error while using cancan in ruby: "uninitialized constant CanCan::Rule::Mongoid" - ruby

here is my controller:
class AdminController < ApplicationController
before_filter :require_user
authorize_resource :class => false
def index
end
def users_list
end
end
here is my Ability class:
class Ability
include CanCan::Ability
def initialize(user)
if user.admin?
can :manage, :all
else
can :read, :all
end
end
end
when trying to access "/admin/users_list" (with an admin user or without) i get the following error:
uninitialized constant CanCan::Rule::Mongoid
any thoughts?

Just recently, CanCan added support for Mongoid and renamed CanDefinition to Rule, so the error you are getting indicates you are using the latest CanCan code from the git repo.
Try out CanCan version 1.4 from rubygems and see if that solves the problem. There may be some bug fixes needed before 1.5 is released to rubygems.
UPDATE:
This bug was fixed in CanCan version 1.5.0.beta1.

Related

Mount grape framework in ramaze framework?

Someone help me to mount grape framework...
require 'grape'
class Api < Grape::API
format :json
resources :articles do
get do
{hello: 'hello world!'}
end
end
end
Also i wanna to change custom routes...

How can I use ActionMailer previews in a Sinatra app?

I have a Sinatra Ruby app with the ActionMailer gem for sending emails. The email sending functionality works fine, but I can't figure out how to use the preview functionality for development. My mailer mailer.rb is located in lib/companyname/mailers, and my preview mailer_preview.rb is located in spec/companyname/mailers/previews. When I run my app and navigate to http://localhost:26250/rails/mailers I get a 404 "Sinatra doesn't know this ditty" page.
What do I need to do to be able to see the previews in my browser?
mailer.rb
module CompanyName
class Mailer < ActionMailer::Base
def test_email(recipient_email_address)
email = mail(to: recipient_email_address, from: "no-reply#companyname.com", subject: "Testing ActionMailer") do |format|
format.html { "<h1>Testing</h1>" }
end
email.deliver_now
end
end
end
mailer_preview.rb
module CompanyName
class MailerPreview < ActionMailer::Preview
def test_email
Mailer.test_email("test#email.com")
end
end
end
After looking at the code for ActionMailer I couldn't find any non-Rails method of configuration, so it looks like this isn't currently possible*. I ended up setting up a Sinatra endpoint to load the HTML from the MailerPreview class and just display it in the browser:
mailers_controller.rb
get "/emails/:email_name" do
halt 404 unless ENV["ENABLE_MAIL_TEST_ENDPOINT"] == "true"
email_preview = CompanyName::MailerPreview.public_send(params["email_name"])
email_preview.html_part.decoded # Note: I switched to the Mail gem instead of ActionMailer, so the code may not be identical
end
*I am not a Rails expert so this may not be the case, however to the best of my abilities I could not see a solution.

undefined method respond_to in Rails 5 controller

I'm upgrading an app from rails 3.something to rails 5. For some reason, I'm am getting undefindied method respond_to anytime I use that method in any of my controllers. This was working before and I was hoping someone here could help.
class StatusController < ApplicationController
#this throws an error 'undefined method respond_to
respond_to :json, :html
end
As per Rails 5 release notes,
Remove respond_to/respond_with placeholder methods, this functionality
has been extracted to the responders gem.
Add responders gem to your Gemfile.

Testing expectations on doubles in Sinatra app using spec

I want to verify that a method was called on a service I want to inject into a Sinatra application using rspec but I can't find an example of how this is done. Here is my spec...
RSpec.configure do |config|
config.include Rack::Test::Methods
end
def app
App
end
describe 'Login' do
context 'when the user is logged out' do
describe 'POST on /signup' do
it 'invokes signup on the user service with the correct parameters' do
service = double('user_service').as_null_object
service.should_receive(:signup).with(:username => 'RobA2345')
post '/signup'
end
end
end
end
Here the App is a modular Sinatra app. I come from a .NET background and I'd use constructor injection here to solve this problem but I know this isn't the ruby way to do it.
Help, as always, is appreciated.
Assuming that you're expecting to receive the message on a new instance of UserService, there are a couple of ways to do this. If you are using a recent version of rspec, this should work:
it 'invokes signup on the user service with the correct parameters' do
UserService.any_instance.should_receive(:signup).with(:username => 'RobA2345')
post '/signup'
end
Alternatively, this should work in just about any version of rspec:
it 'invokes signup on the user service with the correct parameters' do
service = double('user_service').as_null_object
UserService.stub(:new).and_return(service)
service.should_receive(:signup).with(:username => 'RobA2345')
post '/signup'
end

Authlogic Webapp does not work any more in selenium-Javascript tests

Testing a Ruby on Rails application, I have working tests (also asa logged in user), however as soon as I put the ":js=>true" option behind a test
it "does", :js => true do
activate_authlogic
visit '/'
end
a get the web page with an internal error back
You must activate the Authlogic::Session::Base.controller with a controller object before creating objects
How can I get this to work? How can I determine the error more closely?
By now it works for me, I think because of this dirty snippet
module Authlogic
module Session
module Activation
module ClassMethods
def controller
if !Thread.current[:authlogic_controller]
Thread.current[:authlogic_controller] = Authlogic::TestCase::MockController.new
end
Thread.current[:authlogic_controller]
end
end
end
end
end
witch comes from the question SO: authlogic-with-capybara-cucumber-selenium-driver-not-working

Resources