如何对强参数使用增量方法

时间:2016-03-25 10:58:26

标签: ruby-on-rails ruby ruby-on-rails-4

我想要做的是在更新时增加关联模型中的值。

schedule has_many roomsrooms belongs_to schedule。 我想在房间模型中增加day

accepts_nested_attributes_for :rooms, allow_destroy: true也在schedule.rb

中定义

虽然day以外的字段将通过视图输入,但我想仅自动更新day

我尝试使用increment方法等等,但我还没弄清楚如何申请。

我期望的视图图像如下;

Day1
schedule_title1 (Mar 25, 2016)
    room_name1

添加新的一天后;

Day1
schedule_title1 (Mar 25, 2016)
    room_name1
Day2
schedule_title2 (Mar 26, 2016)
    room_name2

schema.rb

  create_table "rooms", force: :cascade do |t|
    t.string   "name"
    t.integer  "schedule_id"
    t.integer  "day",   default: 1   #I'd like to increment when I update
    ...
  end

schedlues_controller.rb

class SchedulesController < ApplicationController
...
  def update

    #I tried some code here before update

    if @schedule.update(schedule_params)
      flash[:success] = "schedule updated!"
      redirect_to root_url
    else
      render 'edit'
    end
  end 
...
  private

    def schedule_params
      params.require(:schedule).permit(:title, :departure_date,  rooms_attributes: [:id, :_destroy, :room, :day])
    end

当我按下“添加房间”按钮并在输入某些内容后更新时,我想增加day

_schedule_form.html.erb

<%= simple_nested_form_for(@schedule) do |f| %>

  <%= f.label :title %>
  <%= f.text_field :title, class: 'form-control' %>
  <%= f.label :departure_date %>
  <%= f.text_field :departure_date, class: 'form-control' %>

  <div id="room">
    <%= f.simple_fields_for :rooms do |r| %>
      <%= r.input :room %>
    <% end %>
    <%= f.link_to_add "Add room", :rooms, data: {target: '#room'}, class: "btn btn-primary" %>
  </div>

<% end %>

如果你能给我任何建议,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

您应该使用Rails counter_cache方法Rails Guide - Counter Cache。惯例是命名daysschedules_count,但您可以在counter_cache声明中指定列。

因此,在您的Schedule模型中,您需要将counter_cache添加到您的belongs_to关联中以获取空间。

class Schedule < ActiveRecord::Base

    belongs_to :room, counter_cache: :days

end

这比使用increment的回调要好,因为它会在您销毁计划时进行处理。