如何显示嵌套资源的 "belongs_to" id?

How to Show Nested Resource's "belongs_to" ids?

而不是 nil 它应该说它嵌套的 id:

  MissedDate Load (0.5ms)  SELECT  "missed_dates".* FROM "missed_dates"  ORDER BY "missed_dates"."id" DESC LIMIT 1
=> #<MissedDate:0x007f8087d86350
 id: 12,
 habit_id: nil,
 level_id: nil,
 date_missed: Thu, 10 Sep 2015 00:00:00 EDT -04:00,,
 created_at: Tue, 01 Sep 2015 01:21:29 EDT -04:00,
 updated_at: Tue, 01 Sep 2015 01:21:29 EDT -04:00>

MissedDate 属于 Level 属于 Habit.

用户在pages/home上点击此处:

<%= link_to new_habit_level_missed_date_path({ habit_id: habit, level_id: habit.current_habit_level.id }) do %>
  <span class="glyphicon glyphicon-remove"></span>
<% end %>

然后他被带到 missed_dates/new,在那里呈现 _form

<%= form_for @missed_date, url: habit_level_missed_dates_path({ habit_id: @habit, level_id: @habit.current_habit_level.id }) do |f| %> # This is probably wrong :/
  <%= f.date_field :date_missed, class: 'form-control', id: 'six', placeholder: 'dd/mm/yyyy' %>
  <%= f.submit %>
<% end %>

MissedDatesController

  def new
    @habit = Habit.find(params[:habit_id])
    @level = @habit.levels.find(params[:level_id])
    @missed_date = MissedDate.new
  end

  def create
    habit = Habit.find(params[:habit_id])
    habit.missed_days = habit.missed_days + 1
    habit.save!
    level = habit.levels.find(params[:level_id])
    level.missed_days = level.missed_days + 1
    if level.missed_days == 3
      level.missed_days = 0
      level.days_lost += habit.calculate_days_lost + 2
    end
    level.save!
    head :ok # this returns an empty response with a 200 success status code
    @missed_date = MissedDate.new(missed_date_params)
    @missed_date.save
  end

路线

  resources :habits do
    resources :levels do
      resources :missed_dates, only: [:create, :new]
    end
  end

通常,当您创建嵌套对象时...您不会像这样创建它:

 @missed_date = MissedDate.new(missed_date_params)

如果它嵌套在习惯下,则在关联对象上创建它。在这种情况下:

@missed_date = level.missed_dates.new(missed_date_params)

否则,您实际上根本没有设置 level_id。

如果必须同时属于习惯和级别,那么你需要确保另一个id在params中。