未在编辑页面上选择属性

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 来进一步分离关注点。