【问题标题】:ActiveAdmin custom resource action (view and action)ActiveAdmin 自定义资源操作(查看和操作)
【发布时间】:2019-09-02 08:32:02
【问题描述】:

我正在尝试制作一个表单来编辑资源的一个属性。这似乎是一件很简单的事情,但我快要死在这里了。我有处理它的代码:

  member_action :revoke, method: :put do
    resource.update(suspended_at: params[:suspended_at])
    redirect_to resource_path, notice: 'Subscription revoked!'
  end

但是我在哪里/如何实际制作表格?

我试过这段代码:

  ActiveAdmin.register_page "Revoke" do
    belongs_to :payment_subscription, parent_class: Payment::Subscription
    content do
      semantic_form_for Payment::Subscription.find(params[:id]) do
        f.inputs do
          f.input :suspended_at, as: :datepicker, datepicker_options: { max_date: Date.today.iso8601 }
        end
        f.actions
      end
    end
  end

但它会抛出一个错误,说Could not find Subscription in active_admin,老实说,我什至不知道我是否在正确的方向。

【问题讨论】:

  • 有几种方法可以做到这一点。您可以通过register_page 块中的page_action dsl 指令来执行此操作。或者您可以使用member_action 来实现这一点,但这必须放在ActiveAdmin 资源文件中,可能位于app/admin/payment_subscriptions.rb。如需帮助,请告诉我您是否有payment_subscription 的工作表单和/或您是否有工作的索引视图。
  • @SjorsBranderhorst 上面的register_page 代码位于资源文件的底部。我让它与这条线 belongs_to "subscriptions", class_name: 'Payment::Subscription' 一起工作,并且表单显示,但是当我尝试提交时崩溃 - 可能是因为它试图找到一个名为 Revoke 的模型?

标签: ruby-on-rails activeadmin


【解决方案1】:

我认为在没有单独的Page 的情况下设置它会更简单。资源文件中可以有 2 个member_action 块。一种是方法:get,另一种方法是:post,例如:

member_action :revoke, :method => :get do
  # this will render the template, if you don't know where to put it,
  # the rails log will tell you where rails is looking for it
end

Rake 路由将帮助您找到路径助手的拼写,您将需要它用于 :action 属性。将您的自定义表单放入模板中。arb(给它 .arb 扩展名)您放入自定义表单:

form(:method => :post, :action => the_path_helper_that_you_just_saw_in_rake_routes_path) do # dont forget _path at   the end
  input(:type => :hidden, :name => 'authenticity_token', :value => form_authenticity_token)
 # your custom inputs
  input :type => :submit, :value => 'Revoke!'
end

那么你将不得不在另一个:member_action 中catch POST:

member_action :revoke, :method => :post do
  # I stub it with this, to see if the POST will reach
  # raise params.inspect
  # your logic
  if true
    # flash message
    redirect_to where_you_want and return
  else 
    # flash message
    # either
    #   render the get member_action
    # or
    # redirect_to the_get_route and return
  end
end

【讨论】:

    【解决方案2】:

    好吧,我想通了。以下是完整设置以供将来参考:


    向将包含表单的页面添加链接:

      action_item :revoke, only: :show, if: -> { !resource.state.suspended? } do
        link_to('Revoke', revoke_active_admin_payment_subscription_path(resource), method: :get)
      end
    

    还有 GET(渲染表单)和 PUT(更新模型)的路由:

      member_action :revoke, method: [:get, :put] do
        if request.put?
          resource.model.update(suspended_at: params[:payment_subscription][:suspended_at])
          redirect_to resource_path, notice: 'Subscription revoked!'
        else
          render :revoke, locals: { resource: resource }
        end
      end
    

    GET 将在 views/active_admin 目录中查找名为 revoke.html.arb 的视图:

    active_admin_form_for resource.model,
      url: revoke_active_admin_payment_subscription_path(resource),
      method: :put do |f|
      f.inputs do
        f.input :suspended_at, as: :datepicker, datepicker_options: { max_date: Date.today.iso8601 }
      end
      f.actions
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多