Ruby on rails 混乱,验证失败后未呈现新操作
因此,我有以下代码:Ruby on rails 混乱,验证失败后未呈现新操作,ruby-on-rails,ruby,Ruby On Rails,Ruby,因此,我有以下代码: def new @all_areas = Area.all @area = Area.new end <% if @all_areas %> <%= f.label :parent_area %> <%= f.collection_select(:parent_area, @all_areas, :_id, :name, prompt: "Select a Parent...") %>
def new
@all_areas = Area.all
@area = Area.new
end
<% if @all_areas %>
<%= f.label :parent_area %>
<%= f.collection_select(:parent_area, @all_areas, :_id, :name, prompt: "Select a Parent...") %>
<% end %>
我之所以传入所有_区域,是因为表单中需要一个下拉框,使用mongoid,一个区域可以递归地嵌入到另一个区域中
我的表单具有以下代码:
def new
@all_areas = Area.all
@area = Area.new
end
<% if @all_areas %>
<%= f.label :parent_area %>
<%= f.collection_select(:parent_area, @all_areas, :_id, :name, prompt: "Select a Parent...") %>
<% end %>
为什么第二次未将@all_区域传递给视图?实际上,我已通过将create操作中的代码更改为以下内容来修复它:
else
render 'new'
else
@all_areas = Area.all
render 'new'
但这很令人惊讶,除非我遗漏了什么 这不是一个bug。该行为的原因是
create
操作实际上与new
操作非常独立,因此您在new
中指定的实例变量不会结转render'new'
只渲染名为“new”的视图,它实际上不调用new
操作
new
发生在您向/areas/new
发出GET
请求时<代码>创建发生在将
发布到/区域
时。因为它们是独立的请求,服务器不记得任何状态——事实上,您可以调用create
,而不必调用new
(比如,如果您在命令行中使用curl)
基本上,您的方法是正确的,您需要在两个操作中设置@all_area
实例变量。您可能希望将其提取到单独的私有方法中,以避免重复