Проблема отображения Ruby-on-Rails - май 2018 существует только один раз, но мое приложение показывает его 7 раз - PullRequest
0 голосов
/ 23 мая 2018

Я новичок в кодировании.Извиняюсь, если это простой ответ, но я искал пару часов и не повезло.

Текущая проблема: май 2018 существует с 1 прогоном.

На моей странице индекса / месяцев есть ссылка на страницу май 2018 , где я мог бы создать свои будущие прогоны в этом месяце.

Однако, если я создам2-й прогон, когда я возвращаюсь на свою индексную страницу / месяцы, появляется ДВЕ ссылки по май 2018 (не та, на которую я рассчитывал).В БД есть только один объект май 2018 года, и он владеет обоими прогонами.(Затем я создаю 3, 4, 5, 6 и т. Д. Ссылки, когда я создаю больше прогонов ...)

Краткий обзор: Это приложение с журналом запусков.Месяц has_many работает.Когда я создаю пробег, он привязан к месяцу.runs_controller.rb

  def create
    @run = @month.runs.build(run_params)
    @run[:user_id] = current_user.id
    @run[:pace_per_mile] = @run.format_pace_per_mile
    if @run.save
      redirect_to month_path(@month)
    else
      @month = Month.find(params[:month_id])
      @runs = @month.runs
      render 'months/show'
    end
  end

Вот мой / месячный индекс index.html.erb, в котором происходит ошибка:

<strong><h2>Your Previous Runs</h2></strong>
<% @months.each do |month| %>
  <%= link_to(month) do %>
    <h3><%= month.name %> <%= month.year %></h3>
  <% end %>
<% end %>

Вот мой месячный # индекс, чтобы вы могли видеть область действия.

def index
  @months = current_user.months
  @month = Month.new
end

Я могу предоставить больше кода, если я чего-то не включаю!

@ xploshioOn, @ fool-dev и @moveson, Спасибо за ваши ответы.

Я включаю модель месяца и пользователя, а также код, в котором создается месяц...

month.rb

class Month < ApplicationRecord
  has_many :runs
  has_many :users, through: :runs

  validates :name, :year, presence: true

  def month_mileage
    self.runs.collect {|run| run.distance}.sum
  end
end

user.rb

class User < ApplicationRecord
  has_secure_password
  validates :email, presence: true
  validates :email, uniqueness: true
  validates :password, presence: true
  validates :password, confirmation: true

  has_many :runs
  has_many :months, through: :runs
end

В настоящее время я создаю месяцы из months_controller .Я начинаю чувствовать, что в этом моя ошибка?

  def create
    @month = Month.new(month_params)
    if @month.save
      redirect_to month_url(@month)
    else
      @months = current_user.months
      render :index
    end
  end

Еще раз спасибо за любой совет!

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Вы загружаете ассоциацию, и для каждого элемента, который находится в отношениях, требуется месяц.Так что просто добавьте .uniq к вашему запросу.

@ months = current_user.months.uniq

0 голосов
/ 23 мая 2018

Может быть непонятно, когда отношения с Пользователем проходят через несколько месяцев.Подумайте, нужны ли вообще эти отношения.

Если вы хотите сохранить текущие отношения между Пользователем и Месяцем, в вашем действии MonthsController # index вы можете сделать следующее:

def index
  @months = current_user.months.uniq
  @month = Month.new
end

Если вы хотите покончить с этим отношением, в вашем действии MonthsController # index я бы сделал следующее:

def index
  @months = current_user.runs.map(&:month).uniq
  @month = Month.new
end

Доступ к месяцам с помощью current_user.runs более понятен и может быть проще следовать.Вызов .uniq для результата устранит дубликаты.

Имейте в виду, что оба вышеуказанных параметра приведут к тому, что вы получите массив, а не объект ActiveRecord.Чтобы избежать этой проблемы, вы можете выполнить свой запрос непосредственно в модели месяца:

def index
  @months = Month.joins(runs: :user).where(users: {id: current_user}).distinct
  @month = Month.new
end

Это вернет объект ActiveRecord, позволяющий вам дополнительно уточнить запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...