未在编辑页面上选择属性
Attribute not selected on edit page
我有项目模型:
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 %>
问题是,当我想编辑现有项目时,下拉 select 元素不会 select 来自数据库的选项,而只有第一个。
生成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>
我需要做什么才能从数据库中获得 selected 优先权?
我认为您需要稍微更改一下模板:
<div>
<%= form.label :priority %>
<%= form.select :priority, [["No priority", "No priority"], ["Low", "Low"], ["Medium", "Medium"], ["High", "High"]] %>
</div>
为什么:由于priority
被覆盖为super.to_s.humanize
,表单助手获取的值是人性化表单而不是枚举键表单。
如果您想获得枚举的原始值,您可以调用枚举的复数名称作为 class 上的方法,例如Project.priorities
。这将 return 枚举定义为的哈希。
进一步的建议:我认为从 ActiveRecord 覆盖属性方法是不值得的。优先级值是模型(数据层)的一个属性,而人性化的字符串实际上属于视图层。我建议首先在 Project
上定义一个名为 humanized_priority
的新方法,但您可以通过将方法提取到视图助手或使用 presenters 来进一步分离关注点。
我有项目模型:
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 %>
问题是,当我想编辑现有项目时,下拉 select 元素不会 select 来自数据库的选项,而只有第一个。
生成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>
我需要做什么才能从数据库中获得 selected 优先权?
我认为您需要稍微更改一下模板:
<div>
<%= form.label :priority %>
<%= form.select :priority, [["No priority", "No priority"], ["Low", "Low"], ["Medium", "Medium"], ["High", "High"]] %>
</div>
为什么:由于priority
被覆盖为super.to_s.humanize
,表单助手获取的值是人性化表单而不是枚举键表单。
如果您想获得枚举的原始值,您可以调用枚举的复数名称作为 class 上的方法,例如Project.priorities
。这将 return 枚举定义为的哈希。
进一步的建议:我认为从 ActiveRecord 覆盖属性方法是不值得的。优先级值是模型(数据层)的一个属性,而人性化的字符串实际上属于视图层。我建议首先在 Project
上定义一个名为 humanized_priority
的新方法,但您可以通过将方法提取到视图助手或使用 presenters 来进一步分离关注点。