2016-06-11 70 views
0

我想在我的AJAX實現類型的應用程序,但我的創建操作得到一個缺失的模板錯誤(Missing template items/create, application/create with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee]}.)。不應該有一個create.html.erb頁面,因爲items創作發生在一個lists#show頁:實現AJAX創建,缺少模板(創建)錯誤

<div class='new-item'> 
    <%= render 'items/form' %> 
</div> 

<div class="js-items"> 
    <% @items.each do |item| %> 
    <%= div_for(item) do %> 
     <p><%= link_to "", list_item_path(@list, item), method: :delete, remote: true, class: 'glyphicon glyphicon-ok', style: "margin-right: 10px" %> 
     <%= item.name %> 
     <% if item.delegated_to != "" && item.user_id == current_user.id %> 
     <small>(Delegated to <%= item.delegated_to %>)</small> 
     <% elsif item.delegated_to != "" && item.user_id != current_user.id %> 
     <small>(Delegated by <%= item.user_id %>)</small> 
     <% end %></p> 
    <% end %> 
    <% end %> 
</div> 

而且_form.html.erb偏袒其鏈接:

<div class="row"> 
    <div class="col-xs-12"> 
    <%= form_for [@list, @item], remote: true do |f| %> 

     <div class="form-group col-sm-6"> 
     <%= f.label :name %> 
     <%= f.text_field :name, class: 'form-control', placeholder: "Enter Item Name" %> 
     </div> 

     <div class="form-group col-sm-6"> 
     <%= f.label 'Delegate To (Not Required)' %> 
     <%= f.text_field :delegated_to, class: 'form-control', placeholder: "Enter an Email Address" %> 
     </div> 

     <div class="text-center"><%= f.submit "Add Item to List", class: 'btn btn-primary' %></div> 
    <% end %> 
    </div> 
</div> 

這裏是在items_controllercreate方法:

def create 
    @list = List.friendly.find(params[:list_id]) 
    @item = @list.items.new(item_params) 
    @item.user = current_user 
    @new_item = Item.new 

    if @item.save 
     flash[:notice] = "Item saved successfully." 
    else 
     flash[:alert] = "Item failed to save." 
    end 

    respond_to do |format| <<<<ERROR CALLED ON THIS LINE 
     format.html 
     format.js 
    end 
    end 

而這裏是我的create.js.erb file:

<% if @item.valid? %> 
    $('.js-items').prepend("<%= escape_javascript(render(@item)) %>"); 
    $('.new-item').html("<%= escape_javascript(render partial: 'items/form', locals: { list: @list, item: @new_item }) %>"); 
<% else %> 
    $('.flash').prepend("<div class='alert alert-danger'><button type='button' class='close' data-dismiss='alert'>&times;</button><%= flash.now[:alert] %></div>"); 
    $('.new-item').html("<%= escape_javascript(render partial: 'items/form', locals: { list: @list, item: @item }) %>"); 
<% end %> 

任何人有任何想法,爲什麼我得到這個?我試圖從items_controller中刪除format.html行,但我得到了一個無法識別的格式錯誤。

+0

刪除format.html,你肯定不需要它。然而,嘗試註釋掉你的create.js.erb文件,但留下一個簡單的console.log來查看錯誤是否來自文件 –

+0

沒有'format.html'我在''ActionController :: UnknownFormat'上得到' respond_to do | format |'行。 (即使使用'console.log'而不是js文件內容。) – Liz

+0

您的表單未成功以JS格式請求。也就是說,'remote:true'選項沒有正確處理。檢查此問題的可能解決方案:http://stackoverflow.com/questions/4227775/rails-form-for-remote-true-is-not-calling-js-method – sealocal

回答

0

您可以強制使用JS格式而不是默認的HTML格式,以便您的respond_to塊將呈現create.js.erb視圖而不是create.html.erb視圖。

<%= form_for([@list, @item], format: :js, remote: true) do |f| %> 

通常情況下,Rails會通過檢測 「非侵入式JavaScript(UJS)」,這將有效地處理format: :js選項爲您的remote: true選項。您的設置中有一些獨特的東西我們沒有確定,這需要您執行format選項。

要看到你的create.js.erb工作,您可以更改渲染管線您item部分:

$('.js-items').prepend("<%= escape_javascript(render(@item)) %>"); 

要呈現一個項目的名稱,包裝在一個<p>標籤:

$('.js-items').prepend("<p>" + <%= @item.name %> + "</p>"); 

您可以自定義該行以生成您想要爲新列表項目顯示的HTML。根據你的上面的代碼,這看起來像它會爲你工作。

當您完成您的待辦事項應用程序時,您可以爲您的項目創建一個部分,然後再次更改該行,以便您的部分將被附加到您的項目列表。

+0

所有這些工作,除了它仍然需要手動刷新,以清除表格和新項目出現在列表中... – Liz

+0

你應該仔細檢查'$('。js-items)''返回正確的DOM元素(''div class =「js-items」>')。您可以在瀏覽器控制檯中運行'$('。js-items)''。然後您可以嘗試添加任意的HTML。看起來你的jQuery代碼中有一些東西沒有按照你希望的方式操縱DOM。 – sealocal