0

所以我有以下代码:

def new 
    @all_areas = Area.all
    @area = Area.new
end

我传入 all_areas 的原因是表单中的下拉框需要它,使用 mongoid 和区域可以递归地嵌入到另一个区域中。

我的表单有以下代码:

 <% if @all_areas %>
        <%= f.label :parent_area %>
        <%= f.collection_select(:parent_area, @all_areas, :_id, :name, prompt: "Select a Parent...") %>
    <% end %>

但是,当我提交“无效值,即空白名称”时,“新”页面不会呈现选择框来选择父级。

这里发生了什么?这是一个错误吗?

我的创建操作非常简单,如果验证失败,我只需执行以下操作:

else
     render 'new'

为什么@all_areas 没有第二次传递给视图?我实际上已通过将创建操作中的代码更改为以下内容来修复它:

else
    @all_areas = Area.all
    render 'new'

但这很令人惊讶,除非我遗漏了什么?

4

1 回答 1

1

这不是一个错误。行为的原因是create动作实际上与动作完全分开new,因此您分配的实例变量new不会被延续。render 'new'只呈现名为“新”的视图,它实际上并不调用new动作。

new当您GET/areas/new. create发生在你POST的时候/areas。因为它们是单独的请求,服务器不记得任何状态 - 事实上,您可以在create不调用的情况下调用new(例如,如果您从命令行使用 curl)。

基本上,您的方法是正确的,您需要在两个操作中设置@all_areas实例变量。您可能希望将其提取到单独的私有方法中以避免重复。

于 2013-01-06T21:05:37.833 回答