我已经生成了自定义操作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
;
错误。
答案 0 :(得分:4)
这取决于您的操作,因此take a look如何实施模板。基本上form_tag my_action_path
或form_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
中,并定义了用于定义配置中的部分的配置方法:list
,edit
,update
等。您的自定义部分不起作用,因为.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,它将被调用。
玩得开心!