如何在索引视图中显示日期:: DAYNAMES?

时间:2015-02-10 01:03:48

标签: ruby-on-rails ruby date

当用户在 _形式中检查:days他已经#34;&#34;时,我希望他的日子出现在 index ,但是当前用户加载索引页面<%= habit.days %>时出现空白,我看到当用户点击提交时,复选标记消失。

_form

&#13;
&#13;
  <%= f.label "Committed to:" %>
  <% Date::DAYNAMES.each do |day| %>
    <%= f.check_box :days, {}, day %>
    <%= day %>
  <% end %>
&#13;
&#13;
&#13;

索引

&#13;
&#13;
<% @habits.each do |habit| %>
  <td><%= habit.days %></td>
<% end %>
&#13;
&#13;
&#13;

我是否需要将代码添加到控制器模型

控制器

&#13;
&#13;
class HabitsController < ApplicationController
  before_action :set_habit, only: [:show, :edit, :update, :destroy]
  before_action :correct_user, only: [:edit, :update, :destroy]
  before_action :authenticate_user!, except: [:index, :show]

  def index
    @habits = Habit.all
  end

  def show
  end

  def new
    @habit = current_user.habits.build
  end

  def edit
  end

  def create
    @habit = current_user.habits.build(habit_params)
    if @habit.save
      redirect_to @habit, notice: 'Habit was successfully created.'
    else
      render action: 'new'
    end
  end

  def update
    if @habit.update(habit_params)
      redirect_to @habit, notice: 'Habit was successfully updated.'
    else
      render action: 'edit'
    end
  end

  def destroy
    @habit.destroy
    redirect_to habits_url
  end

  private
    def set_habit
      @habit = Habit.find(params[:id])
    end

    def correct_user
      @habit = current_user.habits.find_by(id: params[:id])
      redirect_to habits_path, notice: "Not authorized to edit this habit" if @habit.nil?
    end

    def habit_params
      params.require(:habit).permit(:missed, :left, :level, :days, :date_started, :trigger, :action, :target, :positive, :negative)
    end
end
&#13;
&#13;
&#13;

模型

&#13;
&#13;
class Habit < ActiveRecord::Base
	belongs_to :user
	validates :action, presence: true
end
&#13;
&#13;
&#13;

分贝

&#13;
&#13;
class CreateHabits < ActiveRecord::Migration
  def change
    create_table :habits do |t|
      t.string :missed
      t.datetime :left
      t.string :level
      t.datetime :days
      t.datetime :date_started
      t.string :trigger
      t.string :action
      t.string :target
      t.string :positive
      t.string :negative
      t.boolean :mastered

      t.timestamps null: false
    end
  end
end
                                            
                                            
&#13;
&#13;
&#13;

更新

现在索引视图通过以下答案得出结论:

[&#34;星期一&#34;,&#34;星期二&#34;,&#34;星期三&#34;,&#34;星期四&#34;,&#34;&#34;] < / p>

我们怎样才能让它看起来像这样?

周一,周二,周三,周四

1 个答案:

答案 0 :(得分:1)

您没有正确使用f.check_box,该帮助程序设计用于单个属性,而不是在迭代器中使用。

您可能需要以下内容:

<%= f.collection_check_boxes :days, Date::DAYNAMES, :downcase, :to_s %>

更新

经过一些评论和对问题的更新后,我添加了以下评论,我将其放在这里,以便答案与问题相符:

您的迁移显示daysdatetime字段,字符串数组无法正常工作。为了使这项工作(虽然这可能不是你想要的,并且会破坏其他东西?)你需要将该字段转换为text类型,即。迁移中t.text :days,然后在模型中使用serialize :days, Array创建序列化字段。

另一次更新

如果您检查日志,那么您将看到类似:"Unpermitted parameter: days"的内容 - 这是因为您需要指定包含子结构(如数组或散列)的任何内容,因此而不是{{1}在您的:days中,您需要habit_params