Rails 4:before_filter vs. before_action

本文翻译自:Rails 4: before_filter vs. before_action

In rails >4.0.0 generators creates CRUD operations with before_action not before_filter . 在rails> 4.0.0中,生成器使用before_action而不是before_filter创建CRUD操作。 It seems to do the same thing. 它似乎做同样的事情。 So what's the difference between these two? 那么这两者之间的区别是什么?


#1楼

参考:https://stackoom.com/question/17JYq/Rails-before-filter-vs-before-action


#2楼

As we can see in ActionController::Base , before_action is just a new syntax for before_filter . 正如我们在ActionController::Base 看到的那样, before_action只是before_filter一种新语法

However all before_filters syntax are deprecated in Rails 5.0 and will be removed in Rails 5.1 但是,在Rails 5.0 中不推荐使用所有before_filters语法并且将在Rails 5.1中删除它们


#3楼

It is just a name change. 这只是名称的变化。 before_action is more specific, because it gets executed before an action. before_action更具体,因为它在动作之前执行。


#4楼

It is just syntax difference, in rails app there is CRUD, and seven actions basically by name index , new , create , show , update , edit , destroy . 这只是语法差异,在rails app中有CRUD,七个动作基本上都是通过名称索引新建创建显示更新编辑销毁

Rails 4 make it developer friendly to change syntax before filter to before action . Rails 4使得开发人员可以在过滤操作 之前更改语法。

before_action call method before the actions which we declare, like 我们声明的动作之前的before_action调用方法,如

before_action :set_event, only: [:show, :update, :destroy, :edit]

set_event is a method which will call always before show, update, edit and destroy. set_event是一个在显示,更新,编辑和销毁之前始终调用的方法。


#5楼

To figure out what is the difference between before_action and before_filter, we should understand the difference between action and filter. 要弄清楚before_action和before_filter之间的区别,我们应该理解action和filter之间的区别。

An action is a method of a controller to which you can route to. 动作是您可以路由到的控制器的方法。 For example, your user creation page might be routed to UsersController#new - new is the action in this route. 例如,您的用户创建页面可能会路由到UsersController #new - new是此路由中的操作。

Filters run in respect to controller actions - before, after or around them. 过滤器针对控制器操作运行 - 在它们之前,之后或周围。 These methods can halt the action processing by redirecting or set up common data to every action in the controller. 这些方法可以通过将公共数据重定向或设置到控制器中的每个操作来暂停操作处理。

Rails 4 –> _action Rails 4 - > _action

Rails 3 –> _filter Rails 3 - > _filter


#6楼

before_filter/before_action: means anything to be executed before any action executes. before_filter / before_action:表示在执行任何操作之前要执行的任何操作。

Both are same. 两者都是一样的。 they are just alias for each other as their behavior is same. 它们只是彼此的别名,因为它们的行为是相同的。

# frozen_string_literal: true require File.expand_path('../boot', __FILE__) require 'rails' # Pick the frameworks you want: require 'active_model/railtie' require 'active_job/railtie' require 'active_record/railtie' # require 'active_storage/engine' require 'action_controller/railtie' require 'action_mailer/railtie' require 'action_view/railtie' require 'action_cable/engine' # require 'sprockets/railtie' require 'rails/test_unit/railtie' Bundler.require(*Rails.groups) module RedmineApp class Application < Rails::Application # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. # Custom directories with classes and modules you want to be autoloadable. config.autoloader = :zeitwerk # Only load the plugins named here, in the order given (default is alphabetical). # :all can be used as a placeholder for all plugins not explicitly named. # config.plugins = [ :exception_notification, :ssl_requirement, :all ] config.active_record.store_full_sti_class = true config.active_record.default_timezone = :local config.active_record.yaml_column_permitted_classes = [ Symbol, ActiveSupport::HashWithIndifferentAccess, ActionController::Parameters ] config.action_mailer.delivery_job = "ActionMailer::MailDeliveryJob" # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. # config.time_zone = 'Central Time (US & Canada)' # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] # config.i18n.default_locale = :de config.i18n.enforce_available_locales = true config.i18n.fallbacks = true config.i18n.default_locale = 'en' # Configure the default encoding used in templates for Ruby 1.9. config.encoding = "utf-8" # Configure sensitive parameters which will be filtered from the log file. config.filter_parameters += [:password] config.action_mailer.perform_deliveries = false # Do not include all helpers config.action_controller.include_all_helpers = false # Add forgery protection config.action_controller.default_protect_from_forgery = true # Sets the Content-Length header on responses with fixed-length bodies config.middleware.insert_before Rack::Sendfile, Rack::ContentLength # Verify validity of user sessions config.redmine_verify_sessions = true # Specific cache for search results, the default file store cache is not # a good option as it could grow fast. A memory store (32MB max) is used # as the default. If you're running multiple server processes, it's # recommended to switch to a shared cache store (eg. mem_cache_store). # See http://guides.rubyonrails.org/caching_with_rails.html#cache-stores # for more options (same options as config.cache_store). config.redmine_search_cache_store = :memory_store # Configure log level here so that additional environment file # can change it (environments/ENV.rb would take precedence over it) config.log_level = Rails.env.production? ? :info : :debug config.session_store( :cookie_store, :key => '_redmine_session', :path => config.relative_url_root || '/', :same_site => :lax ) if File.exist?(File.join(File.dirname(__FILE__), 'additional_environment.rb')) instance_eval File.read(File.join(File.dirname(__FILE__), 'additional_environment.rb')) end end end 这个文件哪里是关于 静态资源的配置
最新发布
09-10
* file[/var/log/gitlab/gitlab-kas/current] action touch (skipped due to only_if) Recipe: gitlab::database_migrations * ruby_block[check remote PG version] action nothing (skipped due to action :nothing) * rails_migration[gitlab-rails] action run[2025-07-14T15:04:58+08:00] WARN: gitlab-rails does not have a log_group or default logdir mode defined. Setting to 0700. * bash_hide_env[migrate gitlab-rails database] action run ================================================================================ Error executing action `run` on resource 'bash_hide_env[migrate gitlab-rails database]' ================================================================================ Mixlib::ShellOut::ShellCommandFailed ------------------------------------ Expected process to exit with [0], but received '137' ---- Begin output of "bash" ---- STDOUT: STDERR: ---- End output of "bash" ---- Ran "bash" returned 137 Cookbook Trace: (most recent call first) ---------------------------------------- /opt/gitlab/embedded/cookbooks/cache/cookbooks/gitlab/resources/rails_migration.rb:20:in `block in class_from_file' Resource Declaration: --------------------- # In /opt/gitlab/embedded/cookbooks/cache/cookbooks/gitlab/resources/rails_migration.rb 20: bash_hide_env "migrate #{new_resource.name} database" do 21: code <<-EOH 22: set -e 23: log_file="#{logging_settings[:log_directory]}/#{new_resource.logfile_prefix}-$(date +%Y-%m-%d-%H-%M-%S).log" 24: umask 077 25: /opt/gitlab/bin/gitlab-rake #{new_resource.rake_task} 2>& 1 | tee ${log_file} 26: STATUS=${PIPESTATUS[0]} 27: chown #{account_helper.gitlab_user}:#{account_helper.gitlab_group} ${log_file} 28: echo $STATUS > #{new_resource.helper.db_migrate_status_file} 29: exit $STATUS 30: EOH 31: 32: environment new_resource.environment if new_resource.property_is_set?(:environment) 33: new_resource.dependent_services.each do |svc| 34: notifies :restart, svc, :immediately 35: end 36: 37: not_if { new_resource.helper.migrated? } 38: sensitive false 39: end 40: end Compiled Resource: ------------------ # Declared in /opt/gitlab/embedded/cookbooks/cache/cookbooks/gitlab/resources/rails_migration.rb:20:in `block in class_from_file' bash_hide_env("migrate gitlab-rails database") do action [:run] default_guard_interpreter :default interpreter "bash" declared_type :bash_hide_env cookbook_name "gitlab" recipe_name "database_migrations" code " set -e\n log_file=\"/var/log/gitlab/gitlab-rails/gitlab-rails-db-migrate-$(date +%Y-%m-%d-%H-%M-%S).log\"\n umask 077\n /opt/gitlab/bin/gitlab-rake gitlab:db:configure 2>& 1 | tee ${log_file}\n STATUS=${PIPESTATUS[0]}\n chown git:git ${log_file}\n echo $STATUS > /var/opt/gitlab/gitlab-rails/upgrade-status/db-migrate-c6697a9cd49e1cfa45cc31b1ecdb90ae-bd824d1abb2\n exit $STATUS\n" environment "*sensitive value suppressed*" not_if { #code block } end System Info: ------------ chef_version=18.3.0 platform=centos platform_version=7.6.1810 ruby=ruby 3.1.5p253 (2024-04-023 revision 1945f8dc0e) [x86_64-linux] program_name=/opt/gitlab/embedded/bin/cinc-client executable=/opt/gitlab/embedded/bin/cinc-client ================================================================================ Error executing action `run` on resource 'rails_migration[gitlab-rails]' ================================================================================ Mixlib::ShellOut::ShellCommandFailed ------------------------------------ bash_hide_env[migrate gitlab-rails database] (gitlab::database_migrations line 20) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '137' ---- Begin output of "bash" ---- STDOUT: STDERR: ---- End output of "bash" ---- Ran "bash" returned 137 Cookbook Trace: (most recent call first) ---------------------------------------- /opt/gitlab/embedded/cookbooks/cache/cookbooks/gitlab/resources/rails_migration.rb:20:in `block in class_from_file' Resource Declaration: --------------------- # In /opt/gitlab/embedded/cookbooks/cache/cookbooks/gitlab/recipes/database_migrations.rb 51: rails_migration "gitlab-rails" do 52: rake_task 'gitlab:db:configure' 53: logfile_prefix 'gitlab-rails-db-migrate' 54: helper migration_helper 55: 56: environment env_variables 57: dependent_services dependent_services 58: notifies :run, "execute[clear the gitlab-rails cache]", :immediately 59: notifies :run, "ruby_block[check remote PG version]", :immediately 60: 61: only_if { migration_helper.attributes_node['auto_migrate'] } 62: end Compiled Resource: ------------------ # Declared in /opt/gitlab/embedded/cookbooks/cache/cookbooks/gitlab/recipes/database_migrations.rb:51:in `from_file' rails_migration("gitlab-rails") do action [:run] default_guard_interpreter :default declared_type :rails_migration cookbook_name "gitlab" recipe_name "database_migrations" rake_task "gitlab:db:configure" logfile_prefix "gitlab-rails-db-migrate" helper "*sensitive value suppressed*" environment "*sensitive value suppressed*" only_if { #code block } end System Info: ------------ chef_version=18.3.0 platform=centos platform_version=7.6.1810 ruby=ruby 3.1.5p253 (2024-04-023 revision 1945f8dc0e) [x86_64-linux] program_name=/opt/gitlab/embedded/bin/cinc-client executable=/opt/gitlab/embedded/bin/cinc-client [2025-07-14T15:05:48+08:00] INFO: Running queued delayed notifications before re-raising exception [2025-07-14T15:05:48+08:00] INFO: templatesymlink[Create a gitlab.yml and create a symlink to Rails root] sending run action to execute[clear the gitlab-rails cache] (delayed) Recipe: gitlab::gitlab-rails * execute[clear the gitlab-rails cache] action run ================================================================================ Error executing action `run` on resource 'execute[clear the gitlab-rails cache]' ================================================================================ Mixlib::ShellOut::ShellCommandFailed ------------------------------------ Expected process to exit with [0], but received '' ---- Begin output of /opt/gitlab/bin/gitlab-rake cache:clear ---- STDOUT: STDERR: ---- End output of /opt/gitlab/bin/gitlab-rake cache:clear ---- Ran /opt/gitlab/bin/gitlab-rake cache:clear returned Resource Declaration: --------------------- # In /opt/gitlab/embedded/cookbooks/cache/cookbooks/gitlab/recipes/gitlab-rails.rb 543: execute "clear the gitlab-rails cache" do 544: command "/opt/gitlab/bin/gitlab-rake cache:clear" 545: action :nothing 546: not_if { omnibus_helper.not_listening?('redis') || !node['gitlab']['gitlab_rails']['rake_cache_clear'] } 547: end 548: Compiled Resource: ------------------ # Declared in /opt/gitlab/embedded/cookbooks/cache/cookbooks/gitlab/recipes/gitlab-rails.rb:543:in `from_file' execute("clear the gitlab-rails cache") do action [:nothing] default_guard_interpreter :execute command "/opt/gitlab/bin/gitlab-rake cache:clear" declared_type :execute cookbook_name "gitlab" recipe_name "gitlab-rails" not_if { #code block } end System Info: ------------ chef_version=18.3.0 platform=centos platform_version=7.6.1810 ruby=ruby 3.1.5p253 (2024-04-023 revision 1945f8dc0e) [x86_64-linux] program_name=/opt/gitlab/embedded/bin/cinc-client executable=/opt/gitlab/embedded/bin/cinc-client [2025-07-14T15:06:56+08:00] INFO: version_file[Create version file for Gitaly] sending hup action to runit_service[gitaly] (delayed) Recipe: gitaly::enable * runit_service[gitaly] action hup[2025-07-14T15:06:56+08:00] INFO: runit_service[gitaly] signalled (HUP) [2025-07-14T15:06:56+08:00] INFO: runit_service[gitaly] sent hup - send hup to runit_service[gitaly] [2025-07-14T15:06:56+08:00] INFO: file[create /opt/gitlab/embedded/etc/90-omnibus-gitlab-kernel.shmmax.conf kernel.shmmax] sending run action to execute[reload all sysctl conf] (delayed) Recipe: package::sysctl * execute[reload all sysctl conf] action run [execute] * Applying /usr/lib/sysctl.d/00-system.conf ... net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0 * Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ... kernel.yama.ptrace_scope = 0 * Applying /usr/lib/sysctl.d/50-default.conf ... kernel.sysrq = 16 kernel.core_uses_pid = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.promote_secondaries = 1 net.ipv4.conf.all.promote_secondaries = 1 fs.protected_hardlinks = 1 fs.protected_symlinks = 1 * Applying /etc/sysctl.d/90-omnibus-gitlab-kernel.sem.conf ... kernel.sem = 250 32000 32 275 * Applying /etc/sysctl.d/90-omnibus-gitlab-kernel.shmall.conf ... kernel.shmall = 4194304 * Applying /etc/sysctl.d/90-omnibus-gitlab-kernel.shmmax.conf ... kernel.shmmax = 17179869184 * Applying /etc/sysctl.d/99-sysctl.conf ... net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-arptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_local_reserved_ports = 30000-32767 vm.max_map_count = 262144 vm.swappiness = 1 fs.inotify.max_user_instances = 524288 kernel.pid_max = 65535 vm.overcommit_memory = 1 net.core.somaxconn = 511 * Applying /etc/sysctl.d/lvs_dr.conf ... net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.lo.arp_announce = 2 * Applying /etc/sysctl.conf ... net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-arptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_local_reserved_ports = 30000-32767 vm.max_map_count = 262144 vm.swappiness = 1 fs.inotify.max_user_instances = 524288 kernel.pid_max = 65535 vm.overcommit_memory = 1 net.core.somaxconn = 511 [2025-07-14T15:06:56+08:00] INFO: execute[reload all sysctl conf] ran successfully - execute sysctl -e --system Running handlers: [2025-07-14T15:06:56+08:00] ERROR: Running exception handlers There was an error running gitlab-ctl reconfigure: Multiple failures occurred: * Mixlib::ShellOut::ShellCommandFailed occurred in Cinc Client run: rails_migration[gitlab-rails] (gitlab::database_migrations line 51) had an error: Mixlib::ShellOut::ShellCommandFailed: bash_hide_env[migrate gitlab-rails database] (gitlab::database_migrations line 20) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '137' ---- Begin output of "bash" ---- STDOUT: STDERR: ---- End output of "bash" ---- Ran "bash" returned 137 * Mixlib::ShellOut::ShellCommandFailed occurred in delayed notification: execute[clear the gitlab-rails cache] (gitlab::gitlab-rails line 543) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '' ---- Begin output of /opt/gitlab/bin/gitlab-rake cache:clear ---- STDOUT: STDERR: ---- End output of /opt/gitlab/bin/gitlab-rake cache:clear ---- Ran /opt/gitlab/bin/gitlab-rake cache:clear returned Notes: Default admin account has been configured with following details: Username: root Password: You didn't opt-in to print initial root password to STDOUT. Password stored to /etc/gitlab/initial_root_password. This file will be cleaned up in first reconfigure run after 24 hours. NOTE: Because these credentials might be present in your log files in plain text, it is highly recommended to reset the password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password. Running handlers complete [2025-07-14T15:06:56+08:00] ERROR: Exception handlers complete Infra Phase failed. 319 resources updated in 02 minutes 41 seconds Notes: Default admin account has been configured with following details: Username: root Password: You didn't opt-in to print initial root password to STDOUT. Password stored to /etc/gitlab/initial_root_password. This file will be cleaned up in first reconfigure run after 24 hours. NOTE: Because these credentials might be present in your log files in plain text, it is highly recommended to reset the password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password. [2025-07-14T15:06:56+08:00] FATAL: Stacktrace dumped to /opt/gitlab/embedded/cookbooks/cache/cinc-stacktrace.out [2025-07-14T15:06:56+08:00] FATAL: --------------------------------------------------------------------------------------- [2025-07-14T15:06:56+08:00] FATAL: PLEASE PROVIDE THE CONTENTS OF THE stacktrace.out FILE (above) IF YOU FILE A BUG REPORT [2025-07-14T15:06:56+08:00] FATAL: --------------------------------------------------------------------------------------- [2025-07-14T15:06:56+08:00] FATAL: Chef::Exceptions::MultipleFailures: Multiple failures occurred: * Mixlib::ShellOut::ShellCommandFailed occurred in Cinc Client run: rails_migration[gitlab-rails] (gitlab::database_migrations line 51) had an error: Mixlib::ShellOut::ShellCommandFailed: bash_hide_env[migrate gitlab-rails database] (gitlab::database_migrations line 20) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '137' ---- Begin output of "bash" ---- STDOUT: STDERR: ---- End output of "bash" ---- Ran "bash" returned 137 * Mixlib::ShellOut::ShellCommandFailed occurred in delayed notification: execute[clear the gitlab-rails cache] (gitlab::gitlab-rails line 543) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '' ---- Begin output of /opt/gitlab/bin/gitlab-rake cache:clear ---- STDOUT: STDERR: ---- End output of /opt/gitlab/bin/gitlab-rake cache:clear ---- Ran /opt/gitlab/bin/gitlab-rake cache:clear returned
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值