前一段時間,我問了一個類似的關於選擇選項的問題,但我似乎還是無法把頭圍住它。我是相當新的軌道,但這裏就是我想要做Rails:Select options
我有一個帖子表&在裏面,我有一個「post_status」一欄。我 想給每個崗位3個選項:
- 草案
- 待定
- 發佈
我將如何去創造Rails中這3個選項?(我被告知不要使用布爾本)
預先感謝您
前一段時間,我問了一個類似的關於選擇選項的問題,但我似乎還是無法把頭圍住它。我是相當新的軌道,但這裏就是我想要做Rails:Select options
我有一個帖子表&在裏面,我有一個「post_status」一欄。我 想給每個崗位3個選項:
- 草案
- 待定
- 發佈
我將如何去創造Rails中這3個選項?(我被告知不要使用布爾本)
預先感謝您
@Alexander Kobelev答案詳細闡述,我會把它放在模型中:
class Post < ActiveRecord::Base
STATUS_OPTIONS = {
:draft => 'Draft',
:pending => 'Pending',
:published => 'Published'
}
validates_inclusion_of :post_status, :in => STATUS_OPTIONS.keys
end
在你看來:
發佈狀態:<%= select(:post, :post_status, Post::STATUS_OPTIONS.invert) %>
在他們看起來是一個能處理的幾種方法狀態標誌這個特殊的實例,但你問選擇選項,所以這裏是該方法的解決方案。
因爲您沒有指定是否需要保留表中的值,我已經詳細介紹了一種方法,可以通過將它們轉換爲ID(假設它們當前是字符串)來保留它們,如果這不是相關,然後只遵循大膽的指示。
創建一個PostStatus資源(模型,遷移,控制器/視圖,如果你需要改變它們的能力)。
定義的關係
PostStatus
has_many :posts
Post
belongs_to :post_status
添加值到您的PostStatus表(如果你有在這裏,應該匹配現有崗位狀態的字符串表字符串直播系統,讓你轉換數據(詳細如下)
在Post表中將列名更改爲post_status_id,將其類型更改爲int。如果這不是活的,那麼只需重新執行該列的整數遷移如果它是一個實時系統,則需要將數據轉換爲新列,而不是僅更改其類型,以下是建議的方法。
add_column :posts, :post_status_id_tmp, :int
Post.reset_column_information # make the new column available to model methods
Post.all.each do |post|
# Assuming you have a string with the option text currently:
post.post_status_id_tmp = PostStatus.find_by_name(post.post_status).id
post.save
end
remove_column :posts, :post_status
rename_column :posts, :post_status_tmp, :post_status_id
在你的文章表單中添加一個選擇框。
<%= form.collection_select :post_status_id, PostStatus.all, :id, :name %>
這應該至少讓你開始!
雖然這工作,它需要另一個DB命中拿到狀態(在例如英語術語),或你在取得貪婪加載它。總體來看,似乎更多的工作沒有太多的收穫。除非你想動態管理狀態選項。 –
你可以嘗試這樣的事情:
class Post < ActiveRecord::Base
validates_inclusion_of :status, :in => [:draft, :pending, :publish]
def status
read_attribute(:status).to_sym
end
def status= (value)
write_attribute(:status, value.to_s)
end
end
其中狀態爲:字符串,極限:20(只是舉例)遷移
這一個看起來更簡單,我開始圍繞它環繞我的頭。什麼是'極限:20'在做什麼?我正在測試它現在btw,看看我能否得到它的工作@亞歷山大 – Jon
@Jon極限:20 - 最大長度的字符串。看看http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#method-i-column –
這非常簡單。不需要生成另一個控制器/模型。謝謝@Cody – Jon