Rails 无法在 ActiveAdmin 控制器内创建新对象

Rails can't create new object inside of ActiveAdmin controller

我正在 UserAdminUser 之间开发消息系统。 User 部分现在已准备就绪 我正在努力如何允许 Admin 发送对 ActiveAdmin 内部由 User 发起的对话的回复。

代码如下:

# app/admin/conversations.rb
ActiveAdmin.register Conversation do
 decorate_with ConversationDecorator

# ...

  controller do
    def show
      super
      @message = @conversation.messages.build
    end
  end
end

app/views/admin/conversations/_show.html.erb
# ...
  <%= form_for [@conversation, @message] do |f| %>
    <%= f.text_area :body %>
    <%= f.text_field :messageable_id, value: current_user.id, type: "hidden" %>
    <%= f.text_field :messageable_type, value: "#{current_user.class.name}", type: "hidden" %>
    <%= f.submit "Send Reply" %>
  <% end %>
<% end %>

这给我一个错误:

First argument in form cannot contain nil or be empty Extracted source (around line #51): 51 <%= form_for [@conversation, @message] do |f| %>

当我尝试调试时,结果发现 @message = nil_show.html.erb 内部。如果我在 ActiveAdmin 控制器中定义 @message 怎么可能?

[编辑]

如果你好奇,下面的 ConversationController:

class ConversationsController < ApplicationController
  before_action :authenticate_user!
  def index
    @admins = AdminUser.all
    @conversations = Conversation.all
  end

  def new
    @conversation = Conversation.new
    @conversation.messages.build
  end

  def create
    @conversation = Conversation.create!(conversation_params)

    redirect_to conversation_messages_path(@conversation)
  end
end

#routes
  resources :conversations do
    resources :messages
  end

通常您在控制器中设置实例变量,然后Rails稍后在控制器方法完成后对视图进行隐式渲染。

但是,可以通过在控制器方法为 运行,大概这是在调用 super.

时发生的

有关详细信息,请参阅 Layout and Rendering Rails Guide

您需要将作业移到调用 super 之前。

您可能还需要在 ActiveAdmin 控制器中将 @conversation 替换为 resource(这是 ActiveAdmin/InheritedResources gem 的东西)。