Rails将id转换为文本框中的值显示

时间:2015-09-27 02:40:23

标签: ruby-on-rails ruby-on-rails-4

我对铁轨很陌生,而且我试图感受自己的方式。我知道这是一种非常常见的情况。我有一个视图,我显示状态下拉列表。当用户保存记录时,状态ID存储在数据库中。问题是我无法弄清楚如何使用ID来显示状态。

现在这就是我的" show.html.erb"具有

<%= form_for @customer, html: { class: "form-horizontal form-label-left" } do |f| %>
<%= f.text_field :name, class: 'form-control', readonly:'readonly' %>
...

当然只显示状态ID。我是否需要在模型中进行查找并显示...?

我知道这是一个超常见的场景。

EDIT 这是保存id

的下拉列表
<%= form_for @customer, html: { class: "form-horizontal form-label-left" } do |f| %>
<div class="form-group">
   <%= f.label :state, nil, class: 'control-label col-md-3 col-sm-3 col-xs-12' %>
   <div class="col-md-6 col-sm-6 col-xs-12">
     <%= f.select :state, options_for_select(State.all.collect {|c| [ c.abbreviation, c.id ] }), class: 'form-control' %>
   </div>
</div>

这是控制器

  def show
    @customer = Customer.find(params[:id])
  end

2 个答案:

答案 0 :(得分:0)

为什么要将状态id存储在数据库中?如果您想使用州的缩写选择州并想显示州的缩写,那么只需将州的缩写存储在数据库中。

使用<%= f.select :state, options_for_select(State.all.collect {|c| [ c.abbreviation, c.abbreviation ] }), class: 'form-control' %>

或者您可能在状态和客户模型之间存在关联,并且您希望将客户记录映射到状态记录,那么在这种情况下您将必须从数据库加载状态缩写

def show
  @customer = Customer.find(params[:id])
  @state = State.find(@customer.state).abbreviation
end

然后在表单中显示状态

<%= text_field_tag @state, class: 'form-control', readonly:'readonly' %>

答案 1 :(得分:0)

  

我真的很擅长铁轨,而且我想要一路走来。

欢迎来到这个家庭!

-

好的,所以你需要看一下ActiveRecord associations - 这将是你需要的解决方案:

#app/models/customer.rb
class Customer < ActiveRecord::Base
  #columns id | state_id | name | etc | created_at | updated_at
  belongs_to :state, -> { pluck(:name) }
end

#app/models/state.rb
class State < ActiveRecord::Base
   #columns id | name | etc | created_at | updated_at
   has_many :customers
end

这是一个标准has_many/belongs_to关联:

enter image description here

  

我无法弄清楚如何使用ID来显示状态

这就是魔术发生的地方 - 您需要阅读foreign_keys - 这些是参考ID,允许ActiveRecord从其他模型中提取关联数据。

简单来说,这意味着如果您在模型中正确设置关联,则可以调用以下内容:

@customer = Customer.find params[:id]
@customer.state #-> "Colorado"

-

关于您的form,您需要做什么(我猜测您编辑客户,而非创建):< / p>

#app/controllers/customers_controller.rb
class CustomersController < ApplicationController
   def edit
      @customer = Customer.find params[:id]
   end
   def update
      @customer = Customer.find params[:id]
      @customer.update customer_params
   end

   private

   def customer_params
      params.require(:customer).permit(:name, :state)
   end
end

#app/views/customers/edit.html.erb (HTML removed for convenience)
<%= form_for @customer do |f| %>
  <%= f.collection_select :state, State.all, :id, :name %>
  <%= f.submit %>
</div>

这将在state模型中保存相应的Customer属性,允许ActiveRecord在您需要调用它时调用它。