Ruby on rails 在不破坏内置rails验证的情况下嵌入表单

Ruby on rails 在不破坏内置rails验证的情况下嵌入表单,ruby-on-rails,Ruby On Rails,我正在尝试创建一个可重用的注释资源,我可以将其添加到其他资源中,以便它们可以有注释。我可以通过以下方法相对容易地实现这一点: IE:views/blog/index.html.erb # blog here... <%= render partial: 'comments/form', locals: { comment: Comment.new } %> <%= render @comments %> views/comment/_form.html.erb <

我正在尝试创建一个可重用的注释资源,我可以将其添加到其他资源中,以便它们可以有注释。我可以通过以下方法相对容易地实现这一点:

IE:views/blog/index.html.erb

# blog here...
<%= render partial: 'comments/form', locals: { comment: Comment.new } %>
<%= render @comments %>
views/comment/_form.html.erb

<%= bootstrap_form_with(model: comment, local: true) do |form| %>
  <%= form.text_area :message, rows: 5 %>
  <%= form.submit class: 'btn btn-secondary float-right' %>
<% end %>

但是,无论我如何配置表单,表单验证都不起作用

我尝试配置表单的方式:

解决方案1

<%= form_with(model: comment, local: false) do |form| %>

此解决方案可以工作,但是本机rails表单验证中断,并且不会显示验证错误

解决方案2

<%= form_with(model: comment, format: 'json') do |form| %>

再一次,表单验证不起作用,需要我自己用javascript将其连接起来(我宁愿使用rails开箱即用的功能)

解决方案3:

<%= form_with(model: comment, local: true) do |form| %>

但是,当出现验证问题时,它会将我从原始页面重定向到/comments/new(并在那里成功验证)

我发现用“rails方式”做事有很多好处。我的问题是,在不同的资源视图中嵌入一个资源的表单,并且仍然得到良好的内置rails验证,rails的官方方式是什么


rails的官方处理方法是什么?

验证
local:true
模式不起作用,因为您每次都向表单传递一个新的空对象。您需要传递一个刚刚未能保存的对象(因此有
错误
集)

“Rails way”是一个简单的CRUD,在这里,表单由同一个控制器呈现和处理,一旦您已经用共享表单打破了它(您的注释控制器显然不知道如何呈现最初打开的页面表单),我会用javascript(或远程表单)来完成


对于后者-确保在注释
create
action

中适当地呈现错误消息,因为每次都要向窗体传递一个新的空对象,因此
local:true
验证模式不起作用。您需要传递一个刚刚未能保存的对象(因此有
错误
集)

“Rails way”是一个简单的CRUD,在这里,表单由同一个控制器呈现和处理,一旦您已经用共享表单打破了它(您的注释控制器显然不知道如何呈现最初打开的页面表单),我会用javascript(或远程表单)来完成


对于后者-确保在注释
create
action

中适当地呈现错误消息,正如@Vasfed所说,您正在打破轨道,因此您需要在控制器上做更多工作:

def索引
@comment=comment.new#需要此选项才能将其从部分渲染中删除
@comments=comments.all
结束
def创建
@comment=comment.new(comment_参数)
回应待办事项|格式|
if@comment.save
format.html{将_重定向到@comment,注意:'注释已成功创建。}
format.json{render:show,status::created,location:@comment}
其他的
format.html做什么
@comments=comments.all#使用私有方法将其干燥并在索引中使用
渲染:索引
结束
format.json{render json:@comment.errors,status::unprocessable_entity}
结束
结束
在您的视图中,您不需要设置
locals[:comment]
,因为您可以在表单中正确使用
@comment
,但如果需要,您可以保留它:



如果我(可能)忘了什么,我很抱歉。我没有对它进行测试。

正如@Vasfed所说,您正在打破轨道,因此您需要在控制器上做更多的工作:

def索引
@comment=comment.new#需要此选项才能将其从部分渲染中删除
@comments=comments.all
结束
def创建
@comment=comment.new(comment_参数)
回应待办事项|格式|
if@comment.save
format.html{将_重定向到@comment,注意:'注释已成功创建。}
format.json{render:show,status::created,location:@comment}
其他的
format.html做什么
@comments=comments.all#使用私有方法将其干燥并在索引中使用
渲染:索引
结束
format.json{render json:@comment.errors,status::unprocessable_entity}
结束
结束
在您的视图中,您不需要设置
locals[:comment]
,因为您可以在表单中正确使用
@comment
,但如果需要,您可以保留它:



如果我(可能)忘了什么,我很抱歉。我没有测试它。

请添加
create
方法代码。另外,我猜当你说
views/comment/\u comment.html.erb
时,你实际上是指
views/comments/\u form.html.erb
。不是吗?请添加
create
方法代码。另外,我猜当你说
views/comment/\u comment.html.erb
时,你实际上是指
views/comments/\u form.html.erb
。你不觉得吗?
<%= form_with(model: comment, local: true) do |form| %>