Приложение «Создать кнопку в рельсах» не работает. Почему это не сохранить в БД? - PullRequest
0 голосов
/ 01 ноября 2019

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

Модель пользователя:

class User < ApplicationRecord
  has_secure_password
  has_many :workouts, dependent: :destroy

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i.freeze
  validates :name, :email, presence: true
  validates :email, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
end

ТренировкаМодель:

class Workout < ApplicationRecord
  validates :date, presence: true

  belongs_to :user
  has_many :exercises, dependent: :destroy
  accepts_nested_attributes_for :exercises, allow_destroy: true, reject_if: proc{ |attr| attr['name'].blank?}
end

Контроллер тренировки (некоторые методы удалены):

class WorkoutsController < ApplicationController
  before_action :require_login

  def new
    @workout = current_user.workouts.build(date: Date.today)
  end

  def create
    @workout = current_user.workouts.build(workout_params)
    if @workout.save
      redirect_to workouts_path, notice: 'Workout was successfully created.'
    else
      @errors = @workout.errors.full_messages
      redirect_to new_workout_path, notice: @errors
    end
  end

  private

  def workout_params
    params.fetch(:workout, {}).permit(:date, exercises_attributes: %i[_destroy id name reps weight weight_unit hours minutes seconds])
  end
end

_form (вложенная форма удаленных упражнений):

<div class="container-fluid">
  <%= form_with(model: @workout, local: true, authenticity_token: true) do |form| %>
    <%= hidden_field_tag :authenticity_token, form_authenticity_token -%>
    <% if @workout.errors.any? %>
      <div id="error_explanation">
        <h2><%= pluralize(@workout.errors.count, "error") %> prohibited this workout from being saved:</h2>

        <ul>
          <% @workout.errors.full_messages.each do |message| %>
            <li><%= message %></li>
          <% end %>
        </ul>
      </div>
    <% end %>

    <div class="container-fluid align-items-center">
      <form>
        <div class="container-fluid">
          <%= form_for @workout do |f| %>
            <div class="form-group">
              <h2><%= f.label :date %></h2>
              <div style="font-size: 18pt"><%= f.date_field :date %></div>
            </div>
          <% end %>
        </div>
        <div class="actions" >
          <%= link_to "Create Workout", workouts_path, :method => :post %>
          <%= form.submit %>
        </div>
      </form>
    </div>
  <% end %>
</div>

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

Заранее спасибо и дайте мне знать, если вы хотите, чтобы я опубликовал дополнительную информацию.

1 Ответ

0 голосов
/ 01 ноября 2019

Вы вручную добавили теги <form>...</form> в свой HTML, здесь:

<form>
  <div class="container-fluid">
    <%= form_for @workout do |f| %>
      <div class="form-group">
        <h2><%= f.label :date %></h2>
        <div style="font-size: 18pt"><%= f.date_field :date %></div>
      </div>
    <% end %>
  </div>
  <div class="actions" >
    <%= link_to "Create Workout", workouts_path, :method => :post %>
    <%= form.submit %>
  </div>
</form>

Не делайте этого. form_for создает ваши теги формы для вас.

...