如何让 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_controller
和 comments_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 %>
我有一个用于创建新评论的表单。此代码存在于不同控制器下的页面中(假设它是 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_controller
和 comments_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 %>