查看序列化哈希导轨

时间:2017-07-09 17:27:20

标签: ruby-on-rails ruby hash

我正在尝试通过序列化哈希为我的应用程序构建默认清单。我不知道如何将setup_checklist哈希中的信息提取到我的视图中。任何帮助表示赞赏。

这是我的用户模型

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable

  serialize :checklist, Hash

  before_create :setup_checklist

  private

  def setup_checklist
    self.checklist = {
      "Organize Your Finances" => false,
      "Approval Letter" => false,
      "Get a Real Estate Agent and look for houses" => false,
      "Find lawyer" => false,
      "Get the mortgage" => false,
      "Apprisal and inspection" => false,
      "Close the deal" => false
    }
  end
end

我的view.html.erb

<%= form_for :checklist do |f| %>
  <%= f.check_box :checklist %>
<% end %>

我知道我甚至不是很接近但是朝着正确方向转向会很棒

2 个答案:

答案 0 :(得分:0)

要显示散列中的复选框,您需要迭代散列并为每个元素创建一个复选框;例如:

<%= form_for @user do |f| %>
  <% @user.checklist.each do |key, value| %>
    <%= f.check_box key %>
  <% end %>
<% end %>

答案 1 :(得分:0)

可能不是最漂亮的,但这似乎对我有用

view.html.erb

<%= form_for @user do |f| %>
  <%= f.fields_for :checklist do |c| %>
    <% @user.checklist.each do |todo, completed| %>
      <%= c.check_box todo %>&nbsp;<%= c.label todo %><br />
    <% end %>
  <% end %>

  <%= f.submit %>
<% end %>

然后在控制器中

def update
  @user = User.find(params[:id])
  @user.checklist.each do |todo, completed|
    @user.checklist[todo] = params[:user][:checklist][todo] == "1"
  end
  @user.save

  redirect_to action: :show, id: params[:id]
end
当然,您可以将控制器代码移动到模型或重构上的update_checklist方法,但对您有用,但这应该可以帮助您入门。

如果你使用强params,你需要允许每个可能的清单值,它会将它们设置为'0'或'1'而不是真或假,但控制器可能是

    @user.update(params.required(:user).permit(checklist: ["Organize Your Finances", ...]))