无效模型对象的Rails路径助手

时间:2012-12-12 19:49:54

标签: ruby-on-rails ruby validation activerecord path

我有一个表单,用于在同一视图上创建模型(名为Image)和此模型的所有实体的列表。该模型以一对多的关系与称为Deck的第二个模型相关联(一个Deck有许多图像)。我视图中的列表如下所示:

# 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方法中的第二行
# 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>}

1 个答案:

答案 0 :(得分:0)

根据[1]:Build vs new in Rails 3 parent_model.children.build oder parent_model.children.new似乎立即在内存中创建了一个关系。因此,parent_model.children将填充一个新的子模型,其parent_id = parent。

使用Children.new的替代方案似乎在保存新的子对象后添加了这种新关系。因此,它在所有孩子的迭代中失踪。