/ / Jak przesłać zagnieżdżone atrybuty za pośrednictwem nadrzędnego _form przesłać? - rubinowe na szynach, rubinowe, formy

Jak przesłać zagnieżdżone atrybuty za pomocą przesyłania nadrzędnego _form? - rubinowe na szynach, rubinowe, formy

Po kliknięciu submit tylko Duel atrybuty mijają - nie 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

Myślę, że muszę zanurzyć informacje o pojedynku (tj. full_name i collection_select) w obrębie czegoś takiego jak <%= simple_form_for(@dueler) do |f| %>, ale nie chcę dwóch osobnych submit guziki. Gdy użytkownik kliknie, prześlij plik dueler i duel informacje powinny być przekazywane, ponieważ idą ze sobą w parze. W tej chwili tylko duel przesyła informacje i duelers nigdy nie są tworzone.

pojedynki / _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 %>

AKTUALIZACJA

Pierwotnie miałem to w _formularzu:

<%= f.fields_for :duelers do |dueler| %>
<%= render "dueler_fields", :f => dueler %>
<% end %>

Ale wyjąłem to, ponieważ duels_controller new logika nie została do niego przeniesiona, więc przeniosłem kod bezpośrednio do _form, ale teraz nie jestem pewien, co powinno zająć miejsce <%= 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

Odpowiedzi:

1 dla odpowiedzi № 1

Jeśli używasz has_many i belongs_to z accepts_nested_attributes musisz użyć inverse_of aby zapobiec próbom wyszukania rekordów przez Railsy (które oczywiście nie istnieją, ponieważ jeszcze ich nie utworzyłeś)

Zmień swój model pojedynku has_many na:

  has_many :duelers, inverse_of: :duel

Aby uzyskać więcej informacji na ten temat oraz przykład zagnieżdżonego formularza z relacją has_many przy użyciu prostych formularzy, zobacz:

https://robots.thoughtbot.com/accepts-nested-attributes-for-with-has-many-through