ActiveAdmin:想要从控制器而不是视图部分构建新的关联

时间:2011-10-17 16:14:15

标签: ruby-on-rails ruby-on-rails-3.1 activeadmin

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

这是我的图库资源文件:

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:在“控制器执行”块中添加以下方法(基于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

1 个答案:

答案 0 :(得分: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