2016-04-01 106 views
0

所以我引用這個設置什麼,我試圖做的:Dynamic Partial Based on Select Box - Rails 2.3.5Rails的基礎上下拉選項顯示部分

基於一個PRODUCT_TYPE我要動態地顯示兩個不同的諧音各含剩餘形式之一領域。

的application.js

$('#capsule_project_type_id').change(function() { 
     $.ajax({url: '/capsules/form_partial/' + this.value}); 
} 

的routes.rb

get '/form_partial/:id' => 'capsules#form_partial' 

controller.rb

def form_partial 
    @project_type_id = ProjectType.find(params[:id]) 
end 

form_partial.js.erb

<% if @project_type_id == 1 || @project_type_id == 2 %> 
    $('#form-details').html("<%= escape_javascript(render partial: 'form1', locals: { capsule: @capsule, f: f }) %>"); 
<% else %> 
    $('#form-details').html("<%= escape_javascript(render partial: 'form2', locals: { capsule: @capsule, f: f }) %>"); 
<% end %> 

new.html.erb 創建表單:

<%= form_for @capsule, multipart: true do |f| %> 
... 
<div class="form-group"> 
<%= f.label :project_type_id, "Project type" %> 
<%= f.select :project_type_id, ProjectType.all.collect{|p| [p.name, p.id]}, { :include_blank => "Please select a type..." }, { class: "form-control" } %> 
</div> 
<div id="form-details"> 
</div> 

當我選擇下拉阿賈克斯大火,但我不斷收到這個錯誤在控制檯:

ActionView::Template::Error (undefined local variable or method `f' for #<#<Class:0x007fd298ce71e8>:0x007fd2980a0268>): 
    1: <% if @project_type_id == 1 || @project_type_id == 2 %> 
    2: $('#form-details').html("<%= escape_javascript(render partial: 'weddingfields', locals: { capsule: @capsule, f: f }) %>"); 
    3: <% else %> 
    4: $('#form-details').html("<%= escape_javascript(render partial: 'showerfields', locals: { capsule: @capsule, f: f }) %>"); 
    5: <% end %> 

我在變量集合form_partial然而它不被承認。我沒有正確逃脫它嗎?

請指教。

+0

你想用'f:f'來傳遞'{capsule:@capsule,f:f}'是什麼? – 7urkm3n

+0

你需要在你的控制器方法中設置'@ capsule'。 – spickermann

+0

你試過像這樣嗎?<%= j(render partial:'form1',locals:{capsule:@capsule})%>' – 7urkm3n

回答

0

這是一個奇怪的錯誤考慮你在

<%= form_for @capsule, multipart: true do |f| %> 

定義f你確定有沒有額外的end您引用f變量之前?

順便說一句,我不確定AJAX是最好的方法。

相反,您可以將所有表單部分放在頁面上,並最初用CSS/JS隱藏它們全部 。

然後,您可以將Javascript事件處理程序附加到您的窗體,以便當選擇 輸入時,它的相應窗體部分被切換爲打開。

順便說一下,我發現,如果你用手寫而不是使用form_for,通常會更容易理解表單中發生了什麼。你可以看到this tutorial

+0

Max我同意你的看法,並決定昨天改用jQuery。較少的開銷。 – porterhaus