如何让 Rails form_for 指向不同的控制器

How to get Rails form_for to point towards different controller

我有一个用于创建新评论的表单。此代码存在于不同控制器下的页面中(假设它是 app/views/posts/show.html.erb)。

<%= form_for Comment.new do |f| %>
  <%= f.label :content %>
  <%= f.text_field :content %><br/>
  <%= f.submit %>
<% end %>

如果我有像上面那样的 Comment.new,表单就可以工作,但我想使用像 form_for @comment 这样的实例变量,类似于 link 中的第一个代码片段:https://api.rubyonrails.org/v5.2.3/classes/ActionView/Helpers/FormHelper.html

为此,我想我需要像这样定义一个 new 函数并分配一个空注释。我试着把这段代码放在 posts_controllercomments_controller.

def new
  @comment = Comment.new
end

但是当我用 @comment, 替换 Comment.new 时,我得到这个错误:ActionView::Template::Error (First argument in form cannot contain nil or be empty): 这让我相信 new 方法都没有被调用。我在这里做错了什么?

我的 routes.rb 看起来像这样:

Rails.application.routes.draw do
  root to: 'posts#show'
  resources :messages
end

如果您使用显示页面 (app/views/posts/show.html.erb) 来显示表单 在 posts controller

的显示动作中添加这一行
# posts_controller
def show
  @comment = Comment.new
end

如果您还想提交您的表单而不是评论的创建操作,请在 form_for 标签

中提及 url
<%= form_for @comment, url: posts_path do |f| %>
  <%= f.label :content %>
  <%= f.text_field :content %><br/>
  <%= f.submit %>
<% end %>