我創建一個腳手架 -如何在軌道形式下降<select>字段?
rails g scaffold Contact email:string email_provider:string
,但我想要的電子郵件提供商是一個下拉(與Gmail /雅虎/ MSN的選項),而不是文本字段。我怎樣才能做到這一點 ?
我創建一個腳手架 -如何在軌道形式下降<select>字段?
rails g scaffold Contact email:string email_provider:string
,但我想要的電子郵件提供商是一個下拉(與Gmail /雅虎/ MSN的選項),而不是文本字段。我怎樣才能做到這一點 ?
你可以看看the Rails documentation。不管怎麼說,在您的形式:
<%= f.collection_select :provider_id, Provider.order(:name),:id,:name, include_blank: true %>
正如您可以猜到,你應該預先定義電子郵件提供商在另一種模式 - Provider
,有從哪裏選擇。
請看看here
要麼你可以使用軌道標籤或使用普通的HTML標籤
Rails的標籤
<%= select("Contact", "email_provider", Contact::PROVIDERS, {:include_blank => true}) %>
* 上面的代碼將成爲行HTML代碼(HTML標籤),找到它下面*
HTML標籤
<select name="Contact[email_provider]">
<option></option>
<option>yahoo</option>
<option>gmail</option>
<option>msn</option>
</select>
感謝,我仍然困惑,我理解
您在Contact
控制器創建集合 -
app/controllers/contacts_controller.erb
添加
@providers = Provider.all.by_name
新,創建和編輯方法,利用在Provider
模型by_name
一個範圍 - app/models/provider.rb
- 用於按名稱排序
scope by_name order(:name)
然後在視圖 - app/views/contacts/_form.html.erb
- 您使用
<%= f.collection_select :provider_id, @providers, :id, :name, include_blank: true %>
對於導軌形式,我也強烈建議你看一個表單生成像simple_form - https://github.com/plataformatec/simple_form - 這將盡一切繁重。
謝謝邁克爾,我編輯了這個問題,並提出了另一個適用於我的代碼,所以只是想知道如何在下面的答案中提到使用Select和collection_select有什麼區別? – iCyborg
在模型中,
class Contact
self.email_providers = %w[Gmail Yahoo MSN]
validates :email_provider, :inclusion => email_providers
end
在您的形式,
<%= f.select :email_provider,
options_for_select(Contact.email_providers, @contact.email_provider) %>
的options_for_select的第二ARG將有選擇的電流email_provider。
或者自定義選項
<%= f.select :desired_attribute, ['option1', 'option2']%>
<%= f.select:desired_attribute,options_for_select([ 'OPT1'],[ 'OPT2'])這對我的作品 – longJOURNEY
謝謝你,爲我工作 –
這是一輪很長的路要走,但如果你還沒有實現,那麼你可以創建最初的模型這種方式。下面的方法描述了改變現有的數據庫。
1)的電子郵件服務提供商創建一個新的模式:
$ rails g model provider name
2)這將創建一個名稱字符串和時間戳模型。它還創建,我們需要添加到架構與遷移:
$ rake db:migrate
3)添加遷移到添加供應商ID爲聯繫人:
$ rails g migration AddProviderRefToContacts provider:references
4)走了過來遷移文件檢查它看起來OK,並遷移過:
$ rake db:migrate
5)好了,現在我們有一個PROVIDER_ID,我們不再需要原來的email_provider字符串:
$ rails g migration RemoveEmailProviderFromContacts
6)內部遷移文件,添加的變化,這將是這個樣子:
class RemoveEmailProviderFromContacts < ActiveRecord::Migration
def change
remove_column :contacts, :email_provider
end
end
7)一旦做到這一點,遷移變化:
$ rake db:migrate
8)讓我們這一刻,更新我們的模型:
聯繫人:belongs_to :provider
提供者:has_many :contacts
9)然後,我們建立了在視圖中的下拉邏輯在_form.html.erb部分:
<div class="field">
<%= f.label :provider %><br>
<%= f.collection_select :provider_id, Provider.all, :id, :name %>
</div>
10)最後,我們需要添加provders自己。一種方式頂部做到這一點是使用種子文件:
Provider.destroy_all
gmail = Provider.create!(name: "gmail")
yahoo = Provider.create!(name: "yahoo")
msn = Provider.create!(name: "msn")
$ rake db:seed
尼斯解釋跟隨 –
所以模型將是contact.rb,但我應該在哪裏放下邏輯?對於天真的問題抱歉,我是RoR開發新手 – iCyborg
您的問題確定。如果你看看'app/views/contacts'的結構,你會發現一個'_form.html.erb'文件。你可以嘗試把它放在那裏。這個「部分視圖」負責創建和更新您生成的腳手架的操作。 –
建議將訂單(:名稱)移動到模型中的作用域(這是一種方法)。這裏沒有什麼大不了的,但隨着時間的推移,你會發現,視圖模板上的基本業務邏輯(排序)變成了一團糟。將它移動到控制器,或者理想的模型,並在那裏使用可用的範圍。舉一個例子 - 如果最終有三個使用下拉菜單的屏幕或模板,則在視圖中排序意味着3 X重複。把它放在模型中意味着它被定義在一個地方,這是改變它的唯一好地方。 –