3

我知道我不应该在画廊视图部分中为我的画廊构建新的关联图像。但是,我无法在 ActiveAdmin 生成的控制器中执行此操作,显然可以使用资源文件中的“控制器”方法对其进行自定义。如何使用 Controller 方法而不是视图部分来做到这一点?

这是我的画廊资源文件:

ActiveAdmin.register Gallery do

  controller.authorize_resource

  scope_to :current_admin_user

  before_filter :block_access

  controller do
    def block_access
      if params && params['q'] && params['q']['admin_user_id_eq']
        params['q']['admin_user_id_eq'] = nil
      end
    end
  end

 form :partial => "form"

end

这是我的画廊视图部分:

  <% new_image = @gallery.images.build %>  
  <%= semantic_form_for [:admin, @gallery] do |g| %>
    <%= g.inputs "Details" do %>
      <%= g.input :title %>
      <%= g.input :images, :as => :check_boxes, :label_method => Proc.new { |image| image_tag(image.thumb_path, :alt => "") + content_tag("h3", image.title)  } %>
    <% end %>
    <%= g.inputs :for => [:images, new_image], :name => "New Image" do |image| %>
      <% if image.object.new_record? %>
        <%= image.input :title %>
        <%= image.input :asset, :as => :file %>
      <% end %>
    <% end %>
    <%= g.buttons %>
  <% end %>

更新#1:在“controller do”块中添加以下方法(基于Thomas Watson的建议)用于创建/编辑画廊。

def new
  @gallery = Gallery.new
  @new_image = @gallery.images.build
  new!
end

def edit
  @gallery = Gallery.find(params[:id])
  @new_image = @gallery.images.build
  edit!
end

def update
  @gallery = Gallery.find(params[:id])
  @new_image = @gallery.images.build
  update!
end
4

1 回答 1

2

Active Admin 依赖于Inherited Resources的动作魔法。您可以打开任何控制器操作并向其中添加内容。您甚至可以创建自己的实例变量,Active Admin 将自动使用它而不是创建自己的。

在您的情况下,如果您在新操作的何处构建它,您将执行以下操作:

ActiveAdmin.register Gallery do
  controller do
    def new
      @gallery = Gallery.new
      @new_image = @gallery.images.build

      # call `new!` to ensure that the rest of the action continues as normal
      new!
    end
  end
end
于 2011-10-17T16:47:17.123 回答