点击submit
后,只有Duel
个属性正在传递 - 而不是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
我认为我必须在full_name
之类的内容中淹没终结者信息(即collection_select
和<%= simple_form_for(@dueler) do |f| %>
),但我不想要两个单独的submit
} 纽扣。当用户点击提交时,dueler
和duel
信息都应该提交,因为它们是相辅相成的。现在只提交duel
信息,永远不会创建dueler
。
决斗/ _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 %>
最初我在_form中有这个:
<%= f.fields_for :duelers do |dueler| %>
<%= render 'dueler_fields', :f => dueler %>
<% end %>
但是我把它拿出来是因为duels_controller
new
逻辑没有传入它所以我将代码直接移到_form中,但现在我不确定应该怎么做取代<%= 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
答案 0 :(得分:1)
如果您将has_many
和belongs_to
与accepts_nested_attributes
一起使用,则需要使用inverse_of
来阻止Rails尝试查找记录(当然不会存在,因为你还没有创建它们)
将您的Duel模型has_many声明更改为:
has_many :duelers, inverse_of: :duel
有关此内容的更多详细信息以及使用Simple Forms的具有has_many关系的嵌套表单的示例,请查看:
https://robots.thoughtbot.com/accepts-nested-attributes-for-with-has-many-through