【问题标题】:Serialized Hash to allow arbitrary key/value pairs序列化哈希以允许任意键/值对
【发布时间】:2013-06-21 01:20:03
【问题描述】:

我有一个模型,其中包含一个属性,该属性是“设置”的序列化哈希。

这些设置通常为空,这就是我不创建 has_many 关联的原因,但在某些情况下,用户会希望填写这些设置。它应该接受任意数量的键/值对,如下所示:

object.settings = { first_setting: 'My setting', second_setting: 'Something else' }

设置的数量及其值和名称未定义。完全取决于用户。

理想情况下,我想要类似于nested_form 的link_to_add 功能的东西,它允许您为新设置添加一行文本字段,一个用于设置名称,一个用于设置值。

除了我模型中的“序列化:设置,哈希”之外,我几乎无处可去。

非常感谢任何帮助

【问题讨论】:

  • 你可能想看看这个帖子stackoverflow.com/questions/9613208/…
  • @Pierre-LouisGottfrois 遗憾的是,这对我没有多大帮助。提供的解决方案针对您知道哈希将包含哪些键的情况,而我需要用户能够指定哈希中键的数量和名称
  • 我认为你必须通过处理一些元编程来解决这个问题。您可以遍历哈希中的每个键并向用户显示适当的字段。但是要让nested_forms 工作,我认为要走的路是以某种方式让你的散列有一个对象表示。只是一个想法。
  • @Pierre-LouisGottfrois 指针非常感谢,因为我对如何做到这一点一无所知

标签: ruby-on-rails


【解决方案1】:

好的,这是我尝试过的,效果很好。

用户模型 - models/user.rb

class User < ActiveRecord::Base
  serialize :settings

  attr_accessible :email, :settings_attributes

  def settings_attributes=(attributes)
    self.settings = attributes
  end
end

用户控制器 - controllers/users_controller.rb

class UsersController < ApplicationController
  def index
    @users = User.all
  end

  def show
    @user = User.find(params[:id])
  end

  def edit
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(params[:user])
      redirect_to users_path
    else
      render :new
    end
  end
end

用户编辑页面 - views/users/edit.html.erb

<h1>Users#edit</h1>

<%= form_for @user do |f| %>

  <%= f.fields_for :settings_attributes, OpenStruct.new(@user.settings) do |builder| %>

    <% @user.settings.keys.each do |key| %>

      <%= builder.text_field key.to_sym %><br />

    <% end %>

  <% end %>

  <%= f.submit %>

<% end %>

更新用户时,控制器在参数哈希中接收一个名为settings_attributes 的键。通过在我们的 User 模型中定义一个 setter,我们可以编辑序列化的settings 属性。

在视图中,我们只是在 settings 哈希中的所有 keys 上循环并显示 textfield。您可能想要显示其他内容,例如 textarea 甚至 select。这将需要自定义 settings 散列以了解您要显示的设置类型(您可以在散列中存储一个名为 type 的键,其中包含设置的类型和一个键 @987654334 @ 包含设置的名称)

关于add_new_link 功能,您可能想看看这个railscast http://railscasts.com/episodes/196-nested-model-form-revised

我从头开始启动了一个 Rails 应用程序,它运行良好。如果您有任何问题,请告诉我。

【讨论】:

  • 这看起来不错,明天试试。那么添加新密钥呢?您必须以某种方式构造一个在初始化时为空的新键/值对。也许使用隐藏字段来使用两个新文本字段中的第一个中的值设置键?
  • 这可以使用 HTML 和 JS 完成。或者,您可以使用模型名称 SettingUser have_many :settings 来做更复杂但更强大的事情。这样你就可以使用 nested_forms 行为来做所有事情。即使您说设置大部分时间都是空的,实现这种关系可能是一个更好的主意。
  • 最终还是回到了协会。我会将您的回复标记为答案,因为它是我得到的最接近的答案。模仿nested_form 的行为会变得很费力。
  • 是的,加入协会是一个很好的选择;)谢谢你标记我的答案。
猜你喜欢
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多