Ruby on rails 来自散列模型的Rails简单表单

Ruby on rails 来自散列模型的Rails简单表单,ruby-on-rails,ruby,simple-form,Ruby On Rails,Ruby,Simple Form,假设我有一个页面,它创建了一个新联系人,并询问他们从一组预定义的颜色中喜欢什么颜色。接下来是控制器和视图/模板 控制器 class ContactController < ApplicationController class Color attr_accessor :name, :hex def initialize(attributes = {}) attributes.each do |n, v|

假设我有一个页面,它创建了一个新联系人,并询问他们从一组预定义的颜色中喜欢什么颜色。接下来是控制器和视图/模板

控制器

class ContactController < ApplicationController
    class Color
        attr_accessor :name, :hex

        def initialize(attributes = {})
            attributes.each do |n, v|
                send("#{n}=", v)
            end
        end
    end

    def initialize
        super
        @colors = [
            Color.new(:name => "Red", :hex => "#ff0000"),
            Color.new(:name => "Green", :hex => "#00ff00"),
            Color.new(:name => "Blue", :hex => "#0000ff")
        ]   
    end

    def new
        @contact = {
            :contact_info => Contact.new, #first_name, last_name, email, etc.
            :selected_colors => Array.new
        }   
    end
end
class ContactController“Red”,:hex=>“#ff0000”),
新颜色(:name=>“Green”,:hex=>“#00ff00”),
新颜色(:name=>“Blue”,:hex=>“#0000ff”)
]   
结束
def新
@联系人={
:contact_info=>contact.new、#名、姓、电子邮件等。
:所选颜色=>Array.new
}   
结束
结束
查看/模板

<%= simple_form_for @contact, :as => "contact" ... do |f| %>
    <%= f.simple_fields_for :contact_info do |cf| %>
        <%= cf.input :first_name, :label => "First Name:" %>    
        <%= cf.input :last_name, :label => "Last Name:" %>
        <%= cf.input :email, :label => "Email:" %>
    <% end %>
    <%= f.input :selected_colors, :collection => @colors, :as => :check_boxes, :label => "Which colors do you like?:" %>

    <button type="submit">Volunteer!</button>
<% end %>
“联系人”。。。do | f |%>
“名字:”%>
“姓氏:”%>
“电子邮件:”%>
@颜色,:as=>:复选框,:label=>“您喜欢哪种颜色?:”%>
志愿者!
我正在构建一个散列以用作模型,并在表单发回时为所选颜色提供一个位置(
联系[selected\u colors]
)。但是,当我运行此操作时,会出现以下错误:

未定义的方法“选定的颜色”#

但我不明白为什么会发生这种情况,有人能解释一下吗?

尝试修改“新建”操作,在@contact definition后面添加一些行:

def new
  @contact = {
    :contact_info => Contact.new, #first_name, last_name, email, etc.
    :selected_colors => Array.new
  }
  # changes here
  @contact.instance_eval do
    def selected_colors
      self[:selected_colors]
    end
  end
end
这一行所做的只是为hash@contract添加一个单例方法。希望这能奏效