我有一个类似这样的方法:
before_filter :authenticate_rights, :only => [:show]
def authenticate_rights
project = Project.find(params[:id])
redirect_to signin_path unless project.hidden
end
Run Code Online (Sandbox Code Playgroud)
我还想在其他一些控制器中使用此方法,因此我将该方法复制到application_controller中包含的帮助器中.
问题是,在某些控制器中,项目的id不是:id
符号,而是fe :project_id
(也:id
存在a(对于另一个模型)
你会如何解决这个问题?是否可以选择向before_filter操作添加参数(传递右侧参数)?
rails是否对使用以下任一用法执行过滤器之前的顺序做出任何保证:
before_filter [:fn1, :fn2]
Run Code Online (Sandbox Code Playgroud)
要么
before_filter :fn1
before_filter :fn2
Run Code Online (Sandbox Code Playgroud)
我很感激任何帮助.
为清楚起见,简化了名称和对象.基本概念保持不变.
我有三个控制器:dog
,cat
,和horse
.这些控制器都继承自控制器animal
.在控制器中animal
,我有一个before过滤器,用于对用户进行身份验证:
before_filter :authenticate
def authenticate
authenticate_or_request_with_http_basic do |name, password|
name == "foo" && password == "bar"
end
end
Run Code Online (Sandbox Code Playgroud)
在show
行动中dog
,我需要对所有用户具有开放访问权限(跳过身份验证).
如果我要单独编写身份验证dog
,我可以这样做:
before_filter :authenticate, :except => :show
Run Code Online (Sandbox Code Playgroud)
但是由于dog
继承自animal
,我无法访问特定于控制器的操作.添加:except => :show
在animal
控制器不仅将跳过认证show
的作用dog
,也表明中cat
和horse
.不希望出现这种情况.
如何才能跳过身份验证仅针对仍然继承的show
操作?dog
animal
我很难在过滤器之前使用我最近从1.9(?)升级到2.3.11的Rails应用程序.为了尝试调试它,我在控制器中放了一个before_filter:
before_filter :false_filter
Run Code Online (Sandbox Code Playgroud)
以及application_controller.rb中的以下内容:
def false_filter
puts "false filter running"
false
end
Run Code Online (Sandbox Code Playgroud)
然后我从cucumber/webrat或浏览器调用该方法,并且在调用过滤器时(我可以看到puts输出消息),过滤器链不会被终止.
我想知道是否有一些尚未生成的样板代码.任何人都可以建议去哪里看看?
我正在使用设计进行身份验证,并在我的应用程序控制器中有一些before_filters.问题我看到的是,当我尝试注销before_filter时会拦截那个并让我继续查看我在before_filter中设置的视图.有什么办法可以指定应该从应用程序控制器或其他文件中排除哪些控制器?
看哪,一个before_filter
:
class ThingController < ApplicationController
before_filter :check_stuff, :if => proc {Rails.env.production?}
end
Run Code Online (Sandbox Code Playgroud)
在最近的一次代码审查中,我被问到:"这proc
是否需要这个?" 答案似乎是'是',但这是一个合理的问题,我打算通过引用Rails文档或指南或者使用条件before_filter
(现在是别名before_action
)来回答它.
我找不到任何东西.该动作控制器指南提到:only
/ :except
,而不是:if
/ :unless
.
如果失败了,我可以指出代码中的某个地方是否涵盖了这一点?它简单提到这里,但更多的是如何:only
与:except
被处理,而不是:if
或:unless
.
def new
before_filter do
redirect_to "/" unless current_admin || current_company
flash[:notice] = 'You dont have enough permissions to be here' unless current_admin || current_company
end
CODE CODE CODE
end
def edit
before_filter do
redirect_to "/" unless current_admin.id = 5
flash[:notice] = 'You dont have enough permissions to be here' unless current_admin || current_company
end
CODE CODE CODE
end
Run Code Online (Sandbox Code Playgroud)
这是我想要做的代码,但我无法弄清楚如何正确地做到这一点.我想要实现的是为我的每个动作应用before_filter规则.因此,或许用户可以存取权限去INDEX行动,但不会在修改动作等我知道的before_filter方法运行一个单一的时间,我不能跑4个before_filters,我只是给的,因为我的英语不好一些参考.
您必须知道我正在使用Devise作为current_admin和current_company方法.我需要应用不同的过滤器(如果是admin或者如果是company.id = X)和其他操作.
在此先感谢,我非常喜欢这里.任何帮助将不胜感激.
我有一个before_save
在我Message
这样定义模型:
class Message < ActiveRecord::Base
before_save lambda { foo(publisher); bar }
end
Run Code Online (Sandbox Code Playgroud)
当我做:
my_message.update_attributes(:created_at => ...)
Run Code Online (Sandbox Code Playgroud)
foo
并被bar
执行.
有时,我想更新消息的字段而不执行foo
和bar
.
例如,如何更新created_at
字段(在数据库中)而不执行foo
和bar
?
ruby-on-rails before-filter update-attributes ruby-on-rails-3 before-save
是否可以在Rails 3中的before_filter方法中重置默认布局?
我有以下作为我的contacts_controller.rb:
class ContactsController < ApplicationController
before_filter :admin_required, :only => [:index, :show]
def show
@contact = Contact.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @contact }
end
end
[...]
end
Run Code Online (Sandbox Code Playgroud)
以及我的application_controller.rb中的以下内容
class ApplicationController < ActionController::Base
layout 'usual_layout'
private
def admin_required
if !authorized? # please, ignore it. this is not important
redirect_to[...]
return false
else
layout 'admin' [???] # this is where I would like to define a new layout
return true …
Run Code Online (Sandbox Code Playgroud) 过滤器出现之前的顺序是什么?具体来说,关于inheiritance,before_action过滤器发生了什么顺序?例如,这会工作:
class A < ActionController::Base
before_action :set_user
def set_user
@user = something
end
end
class B < A
before_action :set_post
def show
render @post
end
def set_post
@post = @user.posts.first
end
end
Run Code Online (Sandbox Code Playgroud)
"B#show"会起作用吗?筛选顺序有哪些规则供将来参考?我在Rails文档中找不到任何相关内容.