En cliquant submit
seulement le Duel
les attributs sont passants - pas Dueler
.
duels_controller.rb
def new
@duel = Duel.new
@user = User.find(params[:challenge_daddy]) # This pulls in the ID for Challenged User
# Current User
@duel.duelers << Dueler.new(user_id: current_user.id, user_name: current_user.name, user_last_name: current_user.last_name)
@current_user_challenges = current_user.challenges.order(:created_at)
# Challenged User
@duel.duelers << Dueler.new(user_id: @user.id, user_name: @user.name, user_last_name: @user.last_name)
@challenged_user_challenges = @user.challenges.order(:created_at)
respond_with(@duel)
end
Je pense que je dois submerger les informations sur le duelleur (c.-à-d. full_name
et collection_select
) dans quelque chose comme <%= simple_form_for(@dueler) do |f| %>
, mais alors je ne veux pas de deux submit
boutons. Lorsque l'utilisateur clique sur soumettre le dueler
et duel
les informations doivent toutes deux être soumises car elles vont de pair. À l'heure actuelle, seul le duel
informations soumises et les dueler
s ne sont jamais créés.
duels / _form.html.erb
<%= simple_form_for(@duel) do |f| %>
<%= current_user.full_name %> WILL <%= collection_select(:dueler, :challenge_id, @current_user_challenges, :id, :full_challenge, include_blank: true) %>
<%= @user.full_name %> WILL <%= collection_select(:dueler, :challenge_id, @challenged_user_challenges, :id, :full_challenge, include_blank: true) %>
THE LOSER WILL <%= f.text_field :consequence %>.
<%= f.submit %>
<% end %>
METTRE À JOUR
A l'origine, j'avais ceci dans le _form:
<%= f.fields_for :duelers do |dueler| %>
<%= render "dueler_fields", :f => dueler %>
<% end %>
Mais je l'ai sorti parce que le duels_controller
new
la logique ne passait pas dedans alors j’ai déplacé le code directement dans le _form, mais maintenant je ne suis pas sûr de ce qui devrait remplacer <%= f.fields_for :duelers do |dueler| %>
class Dueler < ActiveRecord::Base
belongs_to :user
belongs_to :challenge
belongs_to :duel
end
class Duel < ActiveRecord::Base
belongs_to :user
belongs_to :challenge
has_many :duelers
accepts_nested_attributes_for :duelers, :reject_if => :all_blank, :allow_destroy => true #correct
end
class DuelsController < ApplicationController
before_action :set_duel, only: [:show, :edit, :update, :destroy, :duel_request]
respond_to :html
def index
@duels = Duel.joins(:duelers).all
redirect_to duel(@duel)
end
def duel_request
@dueler = @duel.duelers.where(user_id: current_user)
end
def show
@dueler = Dueler.find_by(user_id: current_user.id)
respond_with(@duel)
end
def user_challenges
@user = User.find_by_name(params[:name])
@challenges = @user.challenges.order(:created_at)
end
def new
@duel = Duel.new
@user = User.find(params[:challenge_daddy])
@duel.duelers << Dueler.new(user_id: current_user.id, user_name: current_user.name, user_last_name: current_user.last_name)
@current_user_challenges = current_user.challenges.order(:created_at)
@duel.duelers << Dueler.new(user_id: @user.id, user_name: @user.name, user_last_name: @user.last_name)
@challenged_user_challenges = @user.challenges.order(:created_at)
respond_with(@duel)
end
def edit
end
def create
@duel = Duel.new(duel_params)
@duel.save
#redirect_to duel_request_url(@duel)
respond_with(@duel)
end
def update
@duel.update(duel_params[:duelers_attributes])
respond_with(@duel)
end
def destroy
@duel.destroy
respond_with(@duel)
end
private
def set_duel
@duel = Duel.find(params[:id])
end
def duel_params
params.require(:duel).permit(:consequence, :reward, duelers_attributes: [:id, :user_id, :challenge_id, :accept])
end
end
Réponses:
1 pour la réponse № 1Si vous utilisez has_many
et belongs_to
avec accepts_nested_attributes
vous devrez utiliser inverse_of
pour empêcher Rails de rechercher des enregistrements (qui n'existent bien sûr pas car vous ne les avez pas encore créés)
Modifiez votre déclaration de modèle has_many de votre modèle de Duel en:
has_many :duelers, inverse_of: :duel
Pour plus de détails sur cela et sur un exemple de formulaire imbriqué avec une relation has_many à l'aide de Formulaires simples, consultez:
https://robots.thoughtbot.com/accepts-nested-attributes-for-with-has-many-through