rails_admin在控制器中设置current_user

use*_*183 3 ruby-on-rails rails-admin

我有一个事件模型:

class Event < ActiveRecord::Base
  belongs_to :author, class_name: 'User'
end
Run Code Online (Sandbox Code Playgroud)

我可以输入控制台:

e=Event.last
e.author
Run Code Online (Sandbox Code Playgroud)

在rails_admin中,当我创建一个新事件时,我不想在表单中显示author_id字段.我想在控制器中设置这样的东西:

@e=Event.new(params)
@e.author_id=current_user.id
@e.save
Run Code Online (Sandbox Code Playgroud)

可以在rails_admin中执行吗?

我在官方维基中找到了这个文档,但我不想使用cancan能力,我不想在表单中设置一个隐藏字段的author_id字段因为安全性很危险,实际上是POST请求可以使用自定义author_id覆盖.我想简单地在控制器中分配author_id.有可能吗?

per*_*ine 6

我没有找到干净的方法在rails_admin中执行此操作.这是一个未解决的问题:https://github.com/sferik/rails_admin/issues/1855.

这可能不是最佳选择,但您可以在create action中覆盖全局逻辑.看看它是如何工作的:https://github.com/sferik/rails_admin/blob/master/lib/rails_admin/config/actions/new.rb.

有一个register_instance_option :controller街区.这意味着您可以通过配置传递此选项.更多信息:https://github.com/sferik/rails_admin/wiki/Actions.

所以如果你真的需要它,你可以编辑/config/initializers/rails_admin.rb:

RailsAdmin.config do |config|

  config.actions do
    dashboard                     # mandatory
    index                         # mandatory

    new do
      controller do
        proc do
          if request.get? # NEW

            @object = @abstract_model.new
            @authorization_adapter && @authorization_adapter.attributes_for(:new, @abstract_model).each do |name, value|
              @object.send("#{name}=", value)
            end
            if object_params = params[@abstract_model.to_param]
              @object.set_attributes(@object.attributes.merge(object_params))
            end
            respond_to do |format|
              format.html { render @action.template_name }
              format.js   { render @action.template_name, layout: false }
            end

          elsif request.post? # CREATE

            @modified_assoc = []
            @object = @abstract_model.new
            satisfy_strong_params!
            sanitize_params_for!(request.xhr? ? :modal : :create)

            @object.set_attributes(params[@abstract_model.param_key])
            @authorization_adapter && @authorization_adapter.attributes_for(:create, @abstract_model).each do |name, value|
              @object.send("#{name}=", value)
            end

            # customization
            if @object.class == Event
              # do whatever you want
            end                

            if @object.save
              @auditing_adapter && @auditing_adapter.create_object(@object, @abstract_model, _current_user)
              respond_to do |format|
                format.html { redirect_to_on_success }
                format.js   { render json: {id: @object.id.to_s, label: @model_config.with(object: @object).object_label} }
              end
            else
              handle_save_error
            end
          end       
        end
      end
    end

    export
    bulk_delete
    show
    edit
    delete
    show_in_app

  end
end
Run Code Online (Sandbox Code Playgroud)

  • 很高兴知道这是一个选项,但是当所有人都需要覆盖一个控制器的一个动作时,必须覆盖整个默认控制器似乎真的很麻烦.这肯定可以在RA中更好地实施.谢谢你提供的信息. (2认同)