/ / Comment soumettre des attributs imbriqués via le parent _form submit? - rubis sur rails, rubis, formes

Comment soumettre des attributs imbriqués via le parent _form submit? - rubis sur rails, rubis, formes

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 duelers 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 № 1

Si 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