我有專案模型:
class Project < ApplicationRecord
acts_as_tenant :account
has_rich_text :description
validates :name, :progress, :priority, :status, presence: true
# Broadcast changes in realtime with Hotwire
after_create_commit -> { broadcast_prepend_later_to :projects, partial: "projects/index", locals: { project: self } }
after_update_commit -> { broadcast_replace_later_to self }
after_destroy_commit -> { broadcast_remove_to :projects, target: dom_id(self, :index) }
enum priority: { no_priority: 0, low: 1, medium: 2, high: 3 }
enum status: { not_started: 0, in_progress: 1, waiting: 2, done: 3 }
def priority
super.to_s.humanize
end
def status
super.to_s.humanize
end
end
在編輯頁面上,我有這個表格:
<%= form_with model: @project do |form| %>
<div>
<%= form.label :name %>
<%= form.text_area :name %>
</div>
<div>
<%= form.label :priority %>
<%= form.select :priority, [["No priority", "no_priority"], ["Low", "low"], ["Medium", "medium"], ["High", "high"]], selected: form.object.priority %>
</div>
<div>
<%= form.submit %>
</div>
<% end %>
問題是,當我想編輯現有專案時,下拉選擇元素不會從資料庫中選擇選項,而只會選擇第一個。
生成的 HTML:
<select name="project[priority]" id="project_priority">
<option value="no_priority">No priority</option>
<option value="low">Low</option>
<option value="medium">Medium</option>
<option value="high">High</option>
</select>
我需要做什么才能從資料庫中選擇優先級?
uj5u.com熱心網友回復:
我認為您需要稍微更改模板:
<div>
<%= form.label :priority %>
<%= form.select :priority, [["No priority", "No priority"], ["Low", "Low"], ["Medium", "Medium"], ["High", "High"]] %>
</div>
為什么:由于priority被重寫為super.to_s.humanize,表單助手獲得的值是人性化的形式而不是列舉鍵形式。
如果您想獲取列舉的原始值,可以將列舉的復數名稱作為類上的方法呼叫,例如Project.priorities. 這將回傳列舉定義為的哈希值。
進一步的建議:我認為從 ActiveRecord 覆寫屬性方法是不值得的。優先級值是模型(資料層)的屬性,而人性化字串真正屬于視圖層。我建議定義一個新的方法開始呼叫humanized_priority,Project但是您可以通過將方法提取到視圖助手或使用演示者來進一步分離關注點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/471102.html
上一篇:RORrspec-rails錯誤:ActiveRecord:連接到“localhost”(::1)的服務器,埠5432失敗:fe_sendauth:未提供密碼
