Rails 无法在 ActiveAdmin 控制器内创建新对象
Rails can't create new object inside of ActiveAdmin controller
我正在 User
和 AdminUser
之间开发消息系统。 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 的东西)。
我正在 User
和 AdminUser
之间开发消息系统。 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 的东西)。