使用RSpec和Devise,我收到映射错误.
1) BusinessesController GET index sets @new_vacation
Failure/Error: sign_in @user
RuntimeError:
Could not find a valid mapping for #<User id: 8009, email: "persons3@cycle7.com", encrypted_password: "$2a$10$joN9Vy6spNAe4uh7W9fcOOdoeSJ5dr/nBwpmlqcv6EYe...", reset_password_token: nil, remember_token: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2011-04-01 17:05:03", updated_at: "2011-04-01 17:05:03", business_id: 7214, confirmation_token: nil, confirmed_at: "2011-08-24 21:23:51", confirmation_sent_at: nil, failed_attempts: 0, unlock_token: nil, locked_at: nil, admin: true, password_salt: nil>
# ./spec/controllers/businesses_controller_spec.rb:10:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)
看起来答案可能就在这里用设计进行RSpec测试:无法找到有效的映射,但我无法得到它.
任何想法,我真的很难过!谢谢.
的routes.rb
constraints(SubdomainRoute) …Run Code Online (Sandbox Code Playgroud) routes.rb =>
Sendemail::Application.routes.draw do
devise_for :users
get "user/index"
get "home/index"
root :to => 'home#index'
end
Run Code Online (Sandbox Code Playgroud)
rake routes =>
new_user_session GET /users/sign_in(.:format) {:action=>"new", :controller=>"devise/sessions"}
user_session POST /users/sign_in(.:format) {:action=>"create", :controller=>"devise/sessions"}
destroy_user_session DELETE /users/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"}
user_password POST /users/password(.:format) {:action=>"create", :controller=>"devise/passwords"}
new_user_password GET /users/password/new(.:format) {:action=>"new", :controller=>"devise/passwords"}
edit_user_password GET /users/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"}
PUT /users/password(.:format) {:action=>"update", :controller=>"devise/passwords"}
cancel_user_registration GET /users/cancel(.:format) {:action=>"cancel", :controller=>"devise/registrations"}
user_registration POST /users(.:format) {:action=>"create", :controller=>"devise/registrations"}
new_user_registration GET /users/sign_up(.:format) {:action=>"new", :controller=>"devise/registrations"}
edit_user_registration GET /users/edit(.:format) {:action=>"edit", :controller=>"devise/registrations"}
PUT /users(.:format) {:action=>"update", :controller=>"devise/registrations"}
DELETE /users(.:format) {:action=>"destroy", :controller=>"devise/registrations"} …Run Code Online (Sandbox Code Playgroud) 所以我已经阅读了如何解决这个问题:
使用AbstractController :: ActionNotFound,自定义设计会话控制器的RSpec测试失败
和
http://lostincode.net/blog/testing-devise-controllers
但是我在哪个文件下添加这些更改是我的问题:
在我的rspec文件夹下
registrations_controller
我试过这个
before :each do
request.env['devise.mapping'] = Devise.mappings[:user]
end
require 'spec_helper'
describe RegistrationsController do
describe "GET 'edit'" do
it "should be successful" do
get 'edit'
response.should be_success
end
end
end
Run Code Online (Sandbox Code Playgroud)
哪个不起作用,任何帮助改变特定文件使这项工作将不胜感激.
编辑
所以我也尝试过 -
所以我创建了一个带有spec/support的文件夹,并创建了一个名为controllers_macros.rb的文件
module ControllerMacros
def login_admin
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:admin]
sign_in Factory.create(:admin) # Using factory girl as an example
end
end
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
user = Factory.create(:user)
user.confirm! # or set …Run Code Online (Sandbox Code Playgroud) 我是第一次在应用程序中使用Devise,我遇到了一个我无法理解的奇怪问题:
我用Devise创建了我的用户模型,并设置了所有注册,用户注册等,一切正常.在我的应用程序标题中,我有我的导航菜单(当前为空)和部分登录,注销等:
_header.html.erb
<div class='topbar'>
<div class='container'>
<%= link_to 'My app', root_path, :class => 'brand' %>
<div class='nav'>
</div>
<%= render 'layouts/user_options' %>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
_user_options.html.erb
<ul class='user-options'>
<% if user_signed_in? %>
<li><%= link_to "Signed in as #{current_user.username}", '#' %></li>
<li><%= link_to "Sign out", destroy_user_session_path, :method => :delete %></li>
<% else %>
<li><%= link_to "Sign up", new_user_registration_path %></li>
<li><%= link_to "Sign in", new_user_session_path %></li>
<% end %>
</ul>
Run Code Online (Sandbox Code Playgroud)
现在我添加导航菜单的第一个链接,如果我使用:
<%= link_to 'Tasks', '/tasks/index' %>
Run Code Online (Sandbox Code Playgroud)
一切都好.但如果我使用:
<%= link_to 'Tasks', :controller => …Run Code Online (Sandbox Code Playgroud) 如果您输入密码错误10次,是否可以让设计超时10分钟?超时我的意思是不可能在X期间输入新密码并收到一条消息,说明您必须等待.
我使用omniauth使用设计并使用Facebook创建登录,但是有丢失设计帮助方法访问的问题,如current_user和user_signed_in?方法不起作用.
def create
omniauth = request.env["omniauth.auth"]
user = User.find_by_provider_and_uid(omniauth["provider"], omniauth["uid"]) || User.create_with_omniauth(omniauth)
session[:user_id] = user.id
redirect_to dashboard_path(user.id), :notice => "Signed in!"
end
Run Code Online (Sandbox Code Playgroud)
redirect_to USercontroller仪表板方法
before_filter :logged_in
def dashboard
@user = User.find(params[:id])
@comment = Comment.new
@comments = @user.comments.all.paginate(:page => params[:page], :per_page => 5)
end
Run Code Online (Sandbox Code Playgroud)
所以这里控制应该在检查ApplicationController中的logged_in方法后转到dashboard方法
ApplicationController中的logged_in方法
def logged_in
if user_signed_in?
return true
else
redirect_to root_path
flash[:message] = "please login"
end
end
Run Code Online (Sandbox Code Playgroud)
当我使用Facebook在控制台生成的代码后登录时
Started GET "/users/52/dashboard" for 127.0.0.1 at Thu Mar 29 12:51:55 +0530 2012
Processing by UsersController#dashboard …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置fb应用程序ID(由omniauth使用),以便其全局设计初始化程序和控制器.
更多信息
我需要它在设计初始化(config/initializer/devise.rb),以便我可以设置config.omniauth:facebook,fb_app_id,fb_app_secret
试图解决方案
我尝试将此信息添加到yml文件(http://railscasts.com/episodes/85-yaml-configuration-file)中,但是,看起来像是为控制器设置了yml哈希,但我无法将其用于设计初始化.
/home/ubuntu/myapp/config/initializers/devise.rb:215:in `block in <top (required)>': uninitialized constant APP_CONFIG (NameError)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我正在使用devise 2.1.0 for rails app 3.2.3.这是我做的:
Add gem 'devise' to Gemfile and run bundle
Run rails g devise:install
Run rails g devise User
Setup db by running rake db:migrate
Run Code Online (Sandbox Code Playgroud)
application.html.erb是这样的:
<%if user_signed_in? %>
Welcome <%= current_user.email%>
<%= link_to "Sign out", destroy_user_session_path%>
<% else %>
<%= link_to "Sign up", new_user_registration_path %> or
<%= link_to "Sign in", new_user_session_path %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
登录和注册工作正常,但当我单击退出时,我收到一条错误消息:
路由错误
没有路由匹配[GET]"/ users/sign_out"尝试运行rake路由以获取有关可用路由的更多信息.
这是rake路线的输出:
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
user_password POST /users/password(.:format) …Run Code Online (Sandbox Code Playgroud) 如何创建允许用户查看其个人资料的页面.
有人在周围工作/看/知道这个问题的答案吗?我将不胜感激.
有没有办法编写Rails方法,它会注销并重定向到自定义页面?我正在使用Devise身份验证gem.
我不希望所有注销都将遵循此重定向,但仅限于调用此方法的位置.