RAILS Больше не могу добавлять статью в мою базу данных после внесения некоторых изменений (fk) - PullRequest
0 голосов
/ 23 мая 2018

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

форма:

  <div class="form-group">
    <%= f.input :title, label: "Titre (optionnel)", class: "form-control" %>
  </div>

  <div class="form-group">
    <%= f.label :content, 'Contenu (requis)' %>
    <%= f.text_area :content, id: "wysiwyg" %>
  </div>

  <div class="form-group">
    <%= f.input :group_id, prompt: "- Choisir un groupe (requis) -", label: false, collection: current_user.groups.order('name') %>
  </div>

  <div class="form-group">
    <%= f.button :submit, @activity.new_record? ? "Créer l'activité" : "Mettre à jour l'activité", class: "btn btn-outline-primary btn-sm" %>
  </div>

Контроллер активности

  def create
    @activity = Activity.new(activity_params)
    @activity.user = current_user
    if @activity.save
      flash[:notice] = "Votre activité a été créée !"
      redirect_to root_path
    else
      flash[:alert] = "Erreur lors la création"
      redirect_to root_path
    end
  end

  def activity_params
    params.require(:activity).permit(:content, :title, :group_id)
  end

модели:

# useractivity
  belongs_to :activity
  belongs_to :user
  validates :user, uniqueness: { scope: :activity }
# user
  has_many :user_activities
  has_many :activities
  has_many :activities, through: :user_activities
# Activity
  has_many :user_activities, dependent: :destroy
  belongs_to :category
  has_many :users, through: :user_activities
  belongs_to :user
  validates :content, presence: true

Трассировка:

Started POST "/activities" for 127.0.0.1 at 2018-05-24 09:38:18 +0200
Processing by ActivitiesController#create as JS
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"j1AMcsR16eBMf+6nTO9NN17NE7Qhz0DS07hu+w1YtYopYcwaRbQw6ThkCK3RQ0wY5MqNxM7Fe9VXezSHAZgUnw==", "activity"=>{"title"=>"TESTTITLE", "content"=>"<p>TESTCONTENT</p>", "group_id"=>"1"}, "commit"=>"Créer l'activité"}
  User Load (2.9ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 2], ["LIMIT", 1]]
  ↳ /home/benjamin/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0.rc1/lib/active_record/log_subscriber.rb:98
   (4.1ms)  BEGIN
  ↳ app/controllers/activities_controller.rb:9
  Group Load (0.5ms)  SELECT  "groups".* FROM "groups" WHERE "groups"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/activities_controller.rb:9
   (0.2ms)  ROLLBACK
  ↳ app/controllers/activities_controller.rb:9
Redirected to http://localhost:3000/
Completed 200 OK in 22ms (ActiveRecord: 8.0ms)

Контроллер:

  def create
    @activity = Activity.new(activity_params)
    @activity.user = current_user
       #line 9 ---->
    if @activity.save
      flash[:notice] = "Votre activité a été créée !"
      redirect_to root_path
    else
      flash[:alert] = "Erreur lors la création"
      redirect_to root_path
    end
  end

1 Ответ

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

Чтобы расширить мой комментарий, вы определяете отношения между пользователями и действиями дважды, что вызовет проблему, здесь:

# user.rb
has_many :activities

# activity.rb
belongs_to :user

И:

# user.rb
has_many :user_activities
has_many :activities, through: :user_activities

# activity.rb
has_many :user_activities, dependent: :destroy
has_many :users, through: :user_activities

Этоозначает, что при вызове user.activities происходит конфликт, так как на него смотрятся две разные ассоциации: has_many - belongs to to и has_many through.Первый - один ко многим, второй - много ко многим.

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

# user.rb
has_many :created_activities, class_name: 'Activity'

has_many :user_activities
has_many :activities, through: :user_activities

# activity.rb
has_many :user_activities, dependent: :destroy
has_many :users, through: :user_activities

belongs_to :master_user, class_name: 'User'

Это обновит ваш код, чтобы вы могли вызывать следующее:

user.created_activities # has_many
user.activities # has_many through

activity.master_user # belongs_to
activity.users # has_many through

Очевидно, что вы можете называть ассоциации по-разному, а также переименовывать отношение has_many through, если оно добавляет ясности.

Документы здесь немного веские, но стоит потратить время на то, чтобы понять - есть и другие варианты, такие как foreign_key, если имена ваших столбцов отличаются от условных обозначений.

Надеюсь, это поможет - напишите мне, если у вас возникнут вопросы:)

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