如何在 ActiveAdmin 中添加一个按钮来为另一个资源创建一个新记录,并使用当前资源中的值预先填充字段?

How to add a button in ActiveAdmin to create a new record for another resource, with fields pre-populated with values from the current resource?

在我的 ActiveAdmin 仪表板中,我有两个资源 - Posts 和 ScrapedPosts。对于 ScrapedPost,我想添加一个 Publish Post 按钮,单击该按钮会转到创建新 Post 的页面(new 操作),其中 Post 的所有字段都预先填充了 ScrapedPost 中的值(Post 和 ScrapedPost 具有相同的架构)。

这是我当前的代码 app/admin/scraped_post.rb

ActiveAdmin.register ScrapedPost do

  action_item :view, only: :show do
    link_to "Publish Post", new_admin_post_path
  end

end

这将添加一个名为 发布 Post 的新按钮。当我点击它时,正如预期的那样,它会创建一个用于添加新 Post 的页面。但是,我希望这些字段预先填充来自我创建 post.

的当前 ScrapedPost 的值

到目前为止我已经尝试了很多东西。 action_item 的文档非常基础,没有帮助。 It looks like I can't pass parameters to the action identified by new_admin_post_path。我该怎么做?

[我这周才开始学习 RoR,所以如果你也能解释一下你的解决方案,我将不胜感激。]

action_item 所做的只是将样式为按钮的 link 注入显示页面。您可以通过将参数嵌入 link 来将参数传递给 link 目标。但是,new 不接受参数,因此要复制 Post 你需要的是 member_action:

member_action :clone do
  resource.clone
  render :new
end

可以这样调用此操作:

action_item :clone, only: :show do
  link_to "Publish Post", clone_admin_post_path
end

首先确保复制 Post 有效。如果你想从 Post 创建一个 ScrapedPost 那么你需要将 Post 的 id 作为参数传递:

link_to "Publish Post", clone_admin_scraped_post_path(post_id: resource.id)

那么ScrapedPost会员动作可以找到:

member_action :clone do
  @scraped_post = Post.find(params[:post_id]).clone.becomes(ScrapedPost)
  render :new
end

顺便说一句,无论好坏,ActiveAdmin 都是 Rails 上 Ruby 之上的额外抽象层,所以我的建议始终是先掌握 vanilla Rails 以缓解学习曲线。