2014-04-08 55 views
0

我意識到這與其他一些問題類似,但我經歷了一些相當多的人,我想我正在做他們建議的,但我的代碼仍然是不工作。Rails js.erb響應不發送本地人到Haml局部

因此,正如標題所說,我試圖從js.erb文件中加載一個部分(以響應AJAX調用)。但是,它無法正常工作。

full_list.html.haml:

=link_to(test_path(@work), id: "privacy-button", remote: true) do 
    = render "privacy_button_content", locals: {:show_others => @work.show_others} 

_privacy_button_content.html.haml:

-if locals[:show_others] == false 
    -test_string = "twas false" 
-else 
    -test_string = "twas true" 
%p = test_string 

works_controller.rb:

def test_function 
    @work.model_function 
    respond_with(:layout => false) 
end 

test_function.js.erb:

$("#privacy-button").html("<%= escape_javascript render(:partial => 'privacy_button_content', locals: {:show_others => @work.show_others}) %>"); 

所以full_list有privacy_button,它是呈現部分,並且單擊#隱私按鈕的響應應該是修改控制器中的某些內容,並獲取response.js.erb。

這正常工作在頁面加載(所以路過當地的部分沒有工作,),但每當我運行AJAX調用我得到

(undefined local variable or method `locals' for #<#<Class:0x00000005006338>:0x000000068481f8>): 

任何幫助,將不勝感激。如下

回答

0

所以,我已經想通了。看起來,我得到的特定錯誤與工作時的渲染語法(當我從視圖中指定render :partial時得到了相同的問題),因此它不是唯一的js.erb。

在partial.js.erb代碼現在看起來像:

$("#privacy-button").html("<%= escape_javascript render("privacy_button_content", :locals => {:show_others => @work.show_others}) %>"); 

正如你可以看到,主要的區別是有render "works_group_list"而非render(partial: => "works_group_list"。正如我所說的,我認爲這可能與我在Haml編寫的視圖有關,不過應該注意的是,當不試圖從js.erb傳遞局部變量時,render(partial:...)語法可以工作。

我也遇到了一些小問題,因爲在html中它是#my-element時,我一直在引用#my_element的內容。所以如果你遇到這個問題,檢查你的拼寫(第三十次)永遠不會傷害。

編輯:

剛一說明,正如其他人指出,利用當地人哈希不是強制性的。因此,該行代碼可以替換爲

$("#privacy-button").html("<%= escape_javascript render("privacy_button_content", :show_others => @work.show_others) %>"); 

這隻要你更新你的部分適當地(指var而不是locals[:var])工作。

1

更新_privacy_button_content.html.haml

-if show_others == false 
    -test_string = "twas false" 
-else 
    -test_string = "twas true" 
%p = test_string 

當您通過show_others在當地人哈希,局部變量會針對你show_others創建。您可以在局部使用show_others,而不是locals[:show_others]

請參閱Passing local variables in Rails Guides。

+0

嘿Kirti,謝謝你回到我身邊。我只是給了一個鏡頭,不幸的是它沒有工作(而之前它加載的初始頁面加載部分,但不是從JavaScript,與此更改它不會加載頁面加載。)我知道我可以通過他們只是「show_others」=> @ work.show_others,這將使你爲部分工作建議的語法,但我切換到當地人的散列,因爲我看到一些人說它可能有助於我的問題(它沒有' )但認爲我的問題可能與在haml和erb之間移動有關,所以我現在正在處理這個問題。 – LiamD

0

應用基爾提Thorat的變化,然後改變

= render "privacy_button_content", locals: {:show_others => @work.show_others} 

= render "privacy_button_content", show_others: @work.show_others 

還記得觀點不應該有邏輯,應該是在一個幫手或在裝飾

順便說一句:我認爲%p = test_string應該是%p= test_string

+0

謝謝你回到我身邊。正如我提到的Kirti,我知道這個語法是可能的,以及如何從兩端使用它,但是通過這種方式與本地哈希相比並沒有改變我的問題(我實際上首先是這樣做的。 )但是,我會編輯我的迴應,提到這種語法也是可能的,並且可能更好。 – LiamD