Rails_admin,如何为自定义操作创建表单?

时间:2015-08-27 08:03:40

标签: ruby-on-rails ruby model-view-controller rails-admin

我已经生成了自定义操作by this link on wiki。我创建了继承自RailsAdmin::Config::Actions::Base

的类

我已在rails_admin_my_action/app/views/rails_admin/main/my_action.html.erb

中为此操作创建了我的观点

当我们为您的控制器创建表单时,我们主要使用form_for来访问我的控制器并执行特定操作,但我认为在rails_admin还有其他内容,因为rails_admin使用自己的控制器是从RailsAdmin::Config::Actions::Base生成的。

如何为自定义rails_admin操作创建表单?

我问这个是因为没有关于此的正确文件。

我的观点是:

<h3>Manage state of <%= @object.name %></h3>
<div class="btn-group" data-toggle="buttons">

  <% @object.state_events.each do |event| %>
      <label class="btn bnt-lg btn-default">
        <%= form.radio_button :state, event, autocomplete: 'off' %> <%= event %>
      </label>

<% end %>


</div>

<br/>

<hr/>

<%= form.submit 'Change', class: 'btn btn-lg btn-primary'  %>

lib/my_action.rb我刚刚复制了register_instance_option :controller edit行动的ActiveModel::ForbiddenAttributesError

当我提交表格时。我收到Model: greetings+=Greeting*; Greeting: 'Tag' (tags+=HashTag)+ ';'; HashTag hidden(): '#' name=ID ; 错误。

2 个答案:

答案 0 :(得分:4)

这取决于您的操作,因此take a look如何实施模板。基本上form_tag my_action_pathform_for @object, url: my_action_path(@abstract_model, @object.id)应该有效。您可以在rails_admin配置中define custom action配置:

RailsAdmin.config do |config|
  config.actions do
    member :my_action do
      only ['MyModel']
      http_methods { [:post, :get] }

      controller do
        proc do
          if request.get?
          elsif request.post?
          end
        end
      end

    end
  end
end

答案 1 :(得分:2)

您可以使用Rails管理员控制器,而不是实现自己的控制器,例如如果您只是需要自定义自定义操作的表单而不涉及其他逻辑。

为此,在添加实际的 Action 之后,您还需要添加 Section ,方法相同,但是从RailsAdmin::Config::Sections::Base继承。

因此,如果您的自定义操作被调用&#34;取消&#34;在lib目录中,你可能有这样的东西:

rails_admin/
└── config/
    └── actions/
    │   └── cancel.rb
    └── sections/
        └── cancel.rb

您的行动可能如下:

require 'rails_admin/config/actions'
require 'rails_admin/config/actions/edit'

module RailsAdmin
  module Config
    module Actions
      class Cancel < Edit
        RailsAdmin::Config::Actions.register(self)

        register_instance_option :link_icon do
          'fa fa-ban'
        end
      end
    end
  end
end

正如您所看到的,您不必实施控制器Proc,它将继承自默认的&#34;编辑&#34;动作。

部分代码看起来很简单,这是我的:

require 'rails_admin/config/sections'
require 'rails_admin/config/sections/edit'

module RailsAdmin
  module Config
    module Sections
      class Cancel < Edit
      end
    end
  end
end

rails_admin.rb

require "rails_admin/config/actions/cancel"
require "rails_admin/config/sections/cancel"

现在让我们看一下RailsAdmin::Config::Sections,它会实现.included方法,这就是为什么此时没有任何工作的原因;)

此模块包含在RailsAdmin::Config::Model中,并定义了用于定义配置中的部分的配置方法:listeditupdate等。您的自定义部分不起作用,因为.included在加载新部分之前执行。

为了解决这个问题,我添加了一个RailsAdmin::Config::Model的补丁,在我加载了所有自定义部分后再次重新执行该方法。这是代码(不是最好的方式,但我太懒了):

module RailsAdmin
  module Config
    class Model
      # Re-execute included(self) to register custom sections
      RailsAdmin::Config::Sections.included(self)
    end
  end
end

更好的选择是实现.register方法,就像RailsAdmin::Config::Actions那样,而不是重新定义已有的方法。

然后您的rails_admin.rb将如下所示:

require "rails_admin/config/actions/cancel"
require "rails_admin/config/sections/cancel"
require "monkey/rails_admin/config/model"

RailsAdmin.config do |config|
  config.actions do
    # ...
    cancel
  end

  config.model "ModelName" do
    cancel do
      field :name
    end
  end
end

那就是它,现在在你可以添加的cancel.haml中(从默认编辑模板中复制):

= rails_admin_form_for @object, url: edit_path(@abstract_model, @object.id), as: @abstract_model.param_key, html: { method: "put", multipart: true, class: "form-horizontal denser", data: { title: @page_name } } do |form|
  = form.generate action: :cancel

此处唯一的区别是传递给#generate的操作名称。 Rails Admin将为您生成表单并将其提交给自己的&#34; Main&#34;控制器。如果你需要为动作添加一些自定义逻辑,那么你可以在你的动作中实现控制器proc,它将被调用。

玩得开心!