0

だから私は次のコードを持っています:

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

all_areas を渡す理由は、フォームのドロップダウン ボックスに必要なためです。mongoid を使用すると、Area を別の Area に再帰的に埋め込むことができます。

私のフォームには次のコードがあります:

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

ただし、「無効な値、つまり空白の名前を送信すると、「新しい」ページは親を選択するための選択ボックスをレンダリングしません。

ここで何が起こっているのですか?これはバグですか?

私の作成アクションは非常に単純です。検証に失敗した場合は、次のことを行うだけです。

else
     render 'new'

2 回目に @all_areas がビューに渡されないのはなぜですか? 作成アクションのコードを次のように変更して、実際に修正しました。

else
    @all_areas = Area.all
    render 'new'

しかし、私が何かを見逃していない限り、これは非常に驚くべきことですか?

4

1 に答える 1

1

バグではありません。この動作の理由は、createアクションが実際にはアクションから完全に分離されているnewため、割り当てたインスタンス変数がnew引き継がれないためです。render 'new'「新規」と呼ばれるビューをレンダリングするだけで、実際にはnewアクションを呼び出しません。

newGETにリクエストを発行すると発生します/areas/new。あなたがするcreateときに起こります。これらは個別のリクエストであるため、サーバーは状態を記憶しません。実際、呼び出すことなく呼び出すことができます(たとえば、コマンドラインからcurlを使用した場合)。POST/areascreatenew

基本的に、あなたのアプローチは正しいです、あなたは両方のアクション@all_areasでインスタンス変数を設定する必要があります。重複を避けるために、別のプライベートメソッドに抽出することをお勧めします。

于 2013-01-06T21:05:37.833 に答える