表格选项作为单选按钮或常规按钮?

时间:2013-08-23 20:05:16

标签: ruby-on-rails forms

我是Rails的新手,做了一些教程,而且我没有网络开发的背景,所以提前道歉。

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

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

我应该使用单选按钮来完成此操作吗?如果是这样,我应该如何使用单选按钮显示文本然后保存为整数?或者我应该使用普通按钮?

非常感谢!

更新

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

配置/ application.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显示我创建的哈希值的人类可读值?

我使用脚手架来构建我的状态,因此状态控制器就是你所期望的。

1 个答案:

答案 0 :(得分: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>

或者您可以在Model中定义方法。

class Status

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

并在视野中使用它。

<td><%= status.status_label %></td>