簡體   English   中英

如何創建這個Ruby on Rails表單?

[英]How to create this Ruby on Rails form?

我有一個如下所示的路線:

map.newsletter '/newsletter', :controller => "newsletter" , :action => "newsletter_signup"

還有一個NewsletterController和一個Newsletter模型。 問題是,我想讓我的控制器保持一個簡單的方法,newsletter_signup。 在那里,我只是檢查請求是post類型還是get類型。 如果它是一個獲得,我只是回饋一個靜態HTML視圖,感謝您注冊我們的新聞通訊。 如果是帖子,我想創建一個新的通訊模型並簽署用戶。 理想情況下,我想將此表單嵌入到我的主頁中,該主頁不會調用新聞通訊控制器。 我認為http:// example / newsletter / 1http:// example / newsletter / new這樣的網址沒有多大意義,因此我設置上述路由的方式只有http:// example / newsletter作品。

我將如何創建此表單? 它接受一個字段,只是一個用戶電子郵件的文本字段。 一旦他們點擊提交,它應該POST到newsletter控制器和newsletter_signup方法。 由於此表單將在我的應用程序的每個頁面的頁腳中,我是否需要在我的默認控制器/操作中執行類似@newsletter = Newsletter.new的操作?

您提議的不是Rails方式,但如果您真的想這樣做,您的控制器操作可以訪問您可以調用get?request對象get? post? 測試方法類型。 有關詳細信息,請參見此處

創建表單可能如下所示:

<% form_for(Newsletter.new, :url => { :action => "newsletter_signup" }, :html => { :method => :post}) do |f| %>
  <%= f.text_field :email_address %>
  <%= f.submit "Signup" %>
<% end %>

更新 :根據提問者的要求提供更多顏色:

誠然,我有點不清楚你在注冊時事通訊(你想要獲得GET)和用POST唱歌之間的區別。 是否您的應用程序還允許用戶注冊除了簡報以外的服務?

當進行數據庫更改並且GET用於讀取操作時,將使用慣用的POST / PUT / DELETE。 令我印象深刻的是,兩種注冊都是數據庫寫入(即你必須在某處存儲電子郵件地址,並在某處存儲用戶信息)。

我想你只需要在NewslettersController create一個create動作(POST)來進行簡報注冊。 甲注冊可能被加一個地址到news_letters表需要創建並保存NewsLetter模型的中間步驟。

用戶注冊(如果我已正確理解),我猜你已經開始了。 所以簡而言之,我認為你正在處理這兩種情況的POST操作。 不需要GET 說得通?

AFAIK,執行此操作的“Rails方式”是使用map.resourcemap.resources ,如果默認名稱沒有意義,則可以使用:path_names選項重命名它們。

例如:

map.resource :newsletter, :only => [:new, :destroy], :path_names => { :new => 'signup', :destroy => 'unsign' }

編輯:

我剛剛意識到我錯過了相當於“創建”的東西,它將用於實際更新數據庫(“新”將呈現一個頁面詢問用戶是否想要注冊新聞稿)。 因此,如果您想要包含嵌入在另一個頁面中的操作號召,那么可能不需要“新”路由。

制作控制器和路線

在這種情況下,我們並沒有真正談論新聞通訊資源,而是簡報注冊資源。 這意味着控制器將被命名為NewsletterSignup ,以下路線將更合適:

map.resource :newsletter_signup, :only => [:create, :destroy]

這將允許您將鏈接/按鈕嵌入到現有頁面中,該頁面發送請求以注冊或從通訊中取消簽名。 這些鏈接背后的操作將使用正常操作和重定向模式來執行更新。

鏈接看起來像:

  POST to /newsletter_signup
DELETE to /newsletter_signup/1

顯示消息

最后,顯示消息“感謝注冊時事通訊”的Rails方式是使用“flash消息”。 這涉及NewsletterSignup控制器的create動作中的以下代碼:

flash[:notice] = 'Thanks for signing up to the newsletter!'

您在頁面視圖中顯示此操作然后重定向回到(注冊鏈接/按鈕打開的頁面),然后可以包含消息:

<% if flash[:notice] %>
  <p class="notice"><%= flash[:notice] %></p>
<% end %>

如果通常使用,可以將上述片段添加到您的布局中,以便可以在任何頁面上顯示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM