Rails 5:select中的枚举未在更新时保存

时间:2016-10-19 18:51:09

标签: ruby-on-rails ruby enums

我正在尝试更新/保存数据库中的枚举,但似乎没有正确传递。 在更新参数传递,但“角色”(用作枚举),似乎在哈希(第3行)之外:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"5mjLbYZH6tJWOympfEApF2EwbR/Nk4cQFvqtCiXhL3hOIs+yOQGbZUaIFqO42aMyUWr3JdX+dYQU4Arkpy3jrQ==", 
"company"=>{"name"=>"Agency 8", "legal_name"=>"agency No8 SIA", "reg_number"=>"123456789", "address"=>"street 8", "bank_acc"=>"123456789", "description"=>"Super agency", 
"website"=>"www.google.com"}, "role"=>"seller_buyer", "commit"=>"Save", "id"=>"13"}

/common/companies_controller.rb 中我有:

def edit
@company = Company.find(params[:id])
end

def update
@company = Company.find(params[:id])
if @company.update_attributes(company_params)
  flash[:success] = "Company updated"
  redirect_to dashboard_path
else
  #render 'edit'
  flash[:error] = "Nothing happened!"
end
end

private
def company_params
    params.require(:company).permit(:name, :legal_name, :reg_number,
                            :address, :bank_acc, :currency, :description, :website, :role)
    end

/models/company.rb 中我有:

    class Company < ApplicationRecord

#Companies has many users
    has_many :accounts, dependent: :destroy
    has_many :users, through: :accounts
    has_many :user_roles, through: :users, source: :roles

    enum currency: {eur: 1}, _suffix: true
    enum role: {seller_buyer: 1, seller: 2, buyer: 3}, _suffix: true
    accepts_nested_attributes_for :accounts, :users

在视图中,我使用此行从下拉列表中选择角色:

<option value=<%= f.select :role, Company.roles.keys.to_a, class: 'form-control' %></option>

更新

这就是视图的样子:

<div class="middle-box text-center loginscreen animated fadeInDown">
<%= form_for([:common, @company]) do |f| %>
    <form class="m-t" role="form" action="">
    <div class="form-group">
            <%= f.text_field :name, class: 'form-control', placeholder: "Name"%>
            <%= f.text_field :legal_name, class: 'form-control', placeholder: "Legal name"%>
            <%= f.text_field :reg_number, class: 'form-control', placeholder: "Registration number"%>
            <%= f.text_field :address, class: 'form-control', placeholder: "Address"%>
            <%= f.text_field :bank_acc, class: 'form-control', placeholder: "Bank account"%>
            <%= f.text_field :description, class: 'form-control', placeholder: "Description"%>
            <%= f.text_field :website, class: 'form-control', placeholder: "Website"%>
            <select class="form-control m-b" name="role">
            <option value=<%= f.select :role, Company.roles.keys.to_a, class: 'form-control' %></option>
            <%= f.submit "Save", class: "btn btn-primary block full-width m-b" %>
            <% end %>
        </div>
</form>

我应该更改什么才能使“角色”枚举更新/保存?

解决方案更新

这是解决方案,在编辑操作中,下拉列表显示数据库的实际值: <%= f.select :role, Company.roles.to_a.map { |w| [w[0].humanize, w[0]] }, {}, {class:"form-control m-b"} %>其他解决方案允许更新,但在“修改”操作中未显示当前值。

2 个答案:

答案 0 :(得分:2)

Parameters: {"utf8"=>"✓", "authenticity_token"=>"5mjLbYZH6tJWOympfEApF2EwbR/Nk4cQFvqtCiXhL3hOIs+yOQGbZUaIFqO42aMyUWr3JdX+dYQU4Arkpy3jrQ==", 
"company"=>{"name"=>"Agency 8", "legal_name"=>"agency No8 SIA", "reg_number"=>"123456789", "address"=>"street 8", "bank_acc"=>"123456789", "description"=>"Super agency", 
"website"=>"www.google.com"}, "role"=>"seller_buyer", "commit"=>"Save", "id"=>"13"}

查看它"role"=>"seller_buyer"散列的company。它应该是这样的:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"5mjLbYZH6tJWOympfEApF2EwbR/Nk4cQFvqtCiXhL3hOIs+yOQGbZUaIFqO42aMyUWr3JdX+dYQU4Arkpy3jrQ==", 
    "company"=>{"name"=>"Agency 8", "legal_name"=>"agency No8 SIA", "reg_number"=>"123456789", "address"=>"street 8", "bank_acc"=>"123456789", "description"=>"Super agency", 
    "website"=>"www.google.com", "role"=>"seller_buyer"}, "commit"=>"Save", "id"=>"13"}

它正在发生,因为您的表单输入未正确生成。你不应该使用select inside选项。 select将按给定数组(Company.roles.keys.to_a)生成选项。

修改 这应该可以解决您的设计问题:

<%= f.select :role, options_for_select(Company.roles.keys.to_a, class: 'form-control'),{},{class:"form-control m-b"} %>

答案 1 :(得分:1)

这看起来很奇怪。

<option value=<%= f.select :role, Company.roles.keys.to_a, class: 'form-control' %></option>

您只需编写此代码即可生成下拉列表。您必须将类添加到f.select以获得所需的样式。

<%= f.select :role, Company.roles.keys.to_a, {}, class: 'form-control m-b' %>