0

我对 Rails 很陌生,做了一些教程,而且我没有 Web 开发背景,所以提前道歉。

我正在创建一个非常简单的应用程序,它允许用户选择三个可用状态更新之一。我应该将这三个状态更新存储为字符串还是整数?目前,我的 Postgres 数据库将状态存储为整数,但我也很好奇是否有一种方法可以指定只能插入数字 1、2 或 3。

第二个问题:我想显示一个显示为三个按钮的表单,每个按钮对应一个特定的设置状态更新。我希望按钮在内部显示一个字符串,以便人类可读,但状态更新对应于 1、2 或 3。用户可以选择哪个状态,如果他们改变主意,可以更改他们选择的状态在提交之前,然后在他们下定决心后点击提交按钮。

我应该使用单选按钮来完成此操作吗?如果是这样,我应该如何使它在单选按钮显示文本的位置,然后另存为整数?还是我应该只使用普通按钮?

非常感谢!

更新:

感谢@Bot,我能够创建一个散列,将人类可读的值定义为相应的状态整数,如下所示:

配置/应用程序.rb:

module MyAppName
   class Application < Rails::Application

   INDENT_STATUSES = {1 => "DUE", 2 => "SHIPPING", 3 => "SHIPPED", 4 => "CLOSED"}.freeze 
   end
end

和_form.html.erb:

<%= simple_form_for(@status) do |f| %>
    <%= f.error_notification %>

    <div class="form-inputs">
    <%= f.input :status , :as => :radio_buttons ,:collection => MyAppName::Application::INDENT_STATUSES.keys, :label_method => lambda { |k| MyAppName::Application::INDENT_STATUSES[k]}, :item_wrapper_class => 'inline', :include_blank => false %> 
    </div>

    <div class="form-actions">
    <%= f.button :submit %>
    </div>
<% end %>

但是在 index.html.erb 中,状态显示为数字而不是人类可读的版本:

<h1>Listing statuses</h1>

<table>
<tr>
<th>Status</th>
<th></th>
<th></th>
<th></th>
</tr>

<% @statuses.each do |status| %>
<tr>
    <td><%= status.status %></td>
    <td><%= link_to 'Show', status %></td>
    <td><%= link_to 'Edit', edit_status_path(status) %></td>
    <td><%= link_to 'Destroy', status, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</table>

<br />

<%= link_to 'New Status', new_status_path %>

如何status.status显示我创建的哈希值的人类可读值?

我使用脚手架来构建我的状态,所以状态控制器是您所期望的。

4

1 回答 1

0

要在 rails 应用程序中拥有基于键值对的字段,您需要首先定义包含这些对的哈希。如果它在整个应用程序中保持不变,您可以使用 config/application.rb 文件来定义它。

module MyAppName
  class Application < Rails::Application
     INDENT_STATUSES = {1 => "DUE", 2 => "SHIPPING", 3 => "SHIPPED", 4 => "CLOSED"}.freeze 
  end
end    

然后在您的表单中,如果您使用的是simple_form ,您可以执行类似的操作。

    <%= f.input :status , :as => :radio_buttons ,:collection => MyAppName::Application::INDENT_STATUSES.keys, :label_method => lambda { |k| MyAppName::Application::INDENT_STATUSES[k]}, :item_wrapper_class => 'inline', :include_blank => false %>    

并且不要忘记在 application.rb 文件中添加任何内容后重新启动服务器。希望能帮助到你。

更新

现在要在显示页面中显示状态,您只需从哈希中获取与状态键对应的值。

 MyAppName::Application::INDENT_STATUSES[indent.status.to_i]

您可以直接在视图中使用它。

<td><%= MyAppName::Application::INDENT_STATUSES[status.status.to_i] %></td>

或者你可以在模型中定义一个方法。

class Status

  #
  # 
  def status_label
    MyAppName::Application::INDENT_STATUSES[self.status.to_i]
  end
end   

并考虑像这样使用它。

<td><%= status.status_label %></td>
于 2013-08-23T20:31:55.380 回答