before_action在编辑操作之前未运行

时间:2014-11-04 19:33:36

标签: ruby-on-rails devise

我想基于数据库中的整数值执行一些计算,用于"用户"类。 (使用设计。)这在 users / show.html.erb 上正常工作,但在 registration / edit.html.erb(localhost:3000 / users / edit)

为此,我在 users_controller.rb

中设置了以下内容:
before_action :set_calc_vars, only: [:edit, :show]  

def edit
    @user = User.find(params[:id])

    respond_to do |format|
        format.html # edit.html.erb
        format.xml { render :xml => @user }
    end
  end

def show
    @user = User.find(params[:id])

    respond_to do |format|
        format.html # show.html.erb
        format.xml { render :xml => @user }
    end
end

protected


#Sets value for calculated variables
def set_calc_vars

    user_client = User.find(params[:id])

    @rev_left = user_client.revlimit - user_client.revused

end

在两个页面上,显示@rev_left值的代码是:

<%= @rev_left %>

我不确定为什么set_calc_vars在show.html.erb上运行但不在edit.html.erb上运行。

在show.html.erb上,它会为登录用户显示正确的整数值。 在edit.html.erb上没有显示任何内容,表明该值为nil。

我的路线如下:

devise_for :users
resources :users, :only => [:show]

root 'pages#home'

1 个答案:

答案 0 :(得分:2)

根据您的路线文件,您使用devise进行身份验证,并拒绝users_controllershow以外的所有操作:

resources :users, :only => [:show]

这意味着Devise::RegistrationsController提供注册/修改操作(请查看here)。如果您要对edit操作执行某些过滤,则应在该特定before_action内部实施registrations_controller。这可以通过以下两种方式实现:

  1. 猴子修补devise gem的源代码。在这种情况下,您应找到gem的本地文件夹并修改相应的.rb文件(不推荐)。
  2. 使用您自己的默认控制器覆盖devise默认控制器并将before_action应用于该覆盖控制器的edit。基本上,您只需在控制器中创建名为devise的文件夹,然后将整个设计控制器复制/粘贴到其中。这不需要额外的配置。有关此主题的更多信息,您可以查看this thread,或者甚至只是在Stack Overflow上查看其他主题,其中包括&#34;设计覆盖&#34;标题。