2017-07-03 22 views
0

用戶正在填寫這東西像這樣的形式:軌 - 從視圖中傳遞值通過GET請求到控制器

簡體版...

<%= form_for @email, url: email_path(@email) do |f| %> 

<%= f.text_field :subject, class: "form-control" %> 

<div class="tooltip-demo" style="margin-top:20px;margin-left:10px"> 
     <%= link_to "Preview", preview_email_path, class: "btn btn-sm btn-primary preview", remote: true %> 
    </div> 

<% end %> 

在我的電子郵件控制器,我有一個方法是這樣的:

def preview 

    print "Email sent!" 

    print params.to_json 

    respond_to do |format| 
     format.json { head :no_content } 
     format.js { } 
    end 
end 

如何在文本框:subject傳遞值到我的預覽方法,以驗證?

這是我的路線的樣子..如果它的問題:你是不是使用Rails

get :preview_email, to: "emails#preview" 
+0

你可以在你的PARAMS的'subject'值,它必須是'PARAMS [:主題]',什麼是'把當你發送params'打印表格? –

+0

我試過了,它不起作用。這是結果'{「controller」=>「emails」,「action」=>「preview」}'@SebastiánPalma – Walker

+0

這就是當你在你的視圖中做的時候,而不是在你的方法中,嘗試檢查方法中的參數響應'email_path'路由。 –

回答

0

我不知道,你可以一個可選的參數添加到您的路線的方式,將其設置在link_to,然後改變它,而無需使用JS。

但我認爲你可以嘗試定義您的路線:

get '/preview_email', to: 'emails#preview', as: 'preview_email' 

那麼你的控制器,因爲你已經做到這一點:

def preview 
    print "Email sent!" 
    print params.to_json 
    respond_to do |format| 
    format.json { head :no_content } 
    format.js { } 
    end 
end 

而且我覺得最大的變化是在你看來,當你可以忽略remote: :true部分link_to和路由定義時,從表單輸入中獲取主題,並且當用戶點擊鏈接「預覽」以通過email_preview路徑對該方法發出AJAX請求時,這條路您收到的主題,你可以做任何你需要的驗證:

有沒有航線,這是'',而是id,使之成爲你的JS腳本訪問。因此,您將獲得preview定位點,添加點擊偵聽器,並且當用戶單擊它時,然後使用preventDefault()停止正常功能,然後創建一個變量,該變量在email[subject]輸入標記上獲取用戶輸入,並使用fetch來創建請求路過的主題變量值和追趕的錯誤:

<script> 
    document.getElementById('preview').addEventListener('click', function(e) { 
    e.preventDefault() 
    let subject = document.querySelector('input[name="email[subject]"]').value 
    fetch(`/preview_email?subject=${subject}`) 
    .catch(function(error) { 
     console.log(error) 
    }) 
    }) 
</script> 
+0

感謝您的幫助!當我這樣做時,我得到'完成401未授權0ms(ActiveRecord:0.0ms)「。也許獲取請求未經授權發送? – Walker

+0

哦,在這種情況下,您需要在請求的主體中添加所需的授權值,如[here](https://stackoverflow.com/a/30204697/5025116),您可以看到如何。 –

+0

編輯:我已經從授權中刪除了預覽,它效果很好!塞巴斯蒂安,這是做這件事的最好方法嗎?這似乎是一個工作,但只是確保我正在編寫好的代碼。謝謝 – Walker

0

形成助手是誰submiting形式前將所有形式的信息。

所以一個替代方法是刪除你的emails#preview動作,只留下email行動。

然後在你的形式也可以有多個submit按鈕,如下所示:

<%= f.submit "Preview" 
<%= f.submit "Submit" 

最後,在你的控制器,可以分離出一些邏輯只是檢查帕拉姆commit,將有內容Preview如果用戶按下預覽按鈕或Submit,否則。

相關問題