0

同じビューにモデル(Imageという名前)とこのモデルのすべてのエンティティのリストを作成するためのフォームがあります。モデルは、デッキと呼ばれる2番目のモデルと1対多の関係で関連付けられています(1つのデッキには多くの画像があります)。私の見解のリストは次のようになります。

# image list    
<% @deck.images.each  do |img| %> # iterates also through invalidated model
    <%= link_to 'Delete', deck_image_path(@deck, img), 
           :confirm => 'Sure?', :method => :delete %>
<% end %>

@imageオブジェクトの検証が失敗すると、私の問題が発生します。反復は無効な画像オブジェクトも繰り返し処理し、次の行にそのオブジェクトのパスがないことを示すエラーを出します。

すべてのオブジェクトで.new_record?を確認できますが、これが推奨される方法ですか?それとも私は絶対に間違ったことをしていますか?私はそのような問題で他に誰も見たことがありません;/

アップデート1-コントローラー

def create
    @deck = Deck.find(params[:id])
    @image = @deck.images.build(params[:image])

        respond_to do |format|
            if @image.save
              # redirect
              flash[:notice] = "Saved succesfully."
              format.html { redirect_to(@deck) }
            else
              # render
              format.html { 
                flash.now[:error] = "Could not be saved."
                render 'decks/show'
              }
        end
    end
end

アップデート2-より多くの混乱

さて、わかりました、私は今絶対に混乱しています。createメソッドの2行目をから変更する

# not working
@image = @deck.images.build(params[:image])

# working
@image = Image.new(params[:image])
@image.deck = @deck

エラーなしで動作するようです。違いはなんですか?

アップデート3-表示とエラーメッセージ

<h3>Upload Image</h3>
<%= form_for @image, :url => deck_images_path(@deck), :html => { :multipart => true } do |form| %>
<fieldset>
    <legend>Upload new image</legend>
    <%= render :partial => 'shared/model_errors', :locals => {:model => @image} %>
    <%= form.file_field :image %><br/>
    <%= form.submit "Upload", :class => 'btn btn-primary' %>
</fieldset>
<% end %>

<h3>Show all existing images</h3>
<% @deck.images.each  do |img| %>
    <%= image_tag img.image.url %>  
    <%= link_to 'Delete'.html_safe, deck_image_path(@deck, img) %>
<% end %>

エラーメッセージ:

No route matches {:controller=>"images", :action=>"destroy", :deck_id=>#<Deck id: 1, 
name: "Test", description: "Test", created_at: "2012-12-10 20:44:22", 
updated_at: "2012-12-10 20:44:22">, :id=>#<Image id: nil, created_at: nil, 
updated_at: nil, image_file_name: nil, image_content_type: nil, 
image_file_size: nil, image_updated_at: nil, deck_id: 1>}
4

1 に答える 1

0

[1]によると: Rails3でのビルドと新規の比較parent_model.children.buildまたはparent_model.children.newは、メモリ内に即座に関係を作成するようです。したがって、parent_model.childrenは、parent_id=parentを持つ新しい子モデルで埋められます。

Children.newの代替手段は、新しい子オブジェクトを保存した後、この新しい関係を追加するようです。したがって、すべての子に対する反復で欠落しています。

于 2012-12-13T09:46:07.017 に答える