2016-10-15 13 views
0

Это то, что я в настоящее время получаю:Как сохранить идентификатор для обоих вложенных атрибутов?

Started POST "/duels" for 127.0.0.1 at 2016-10-15 02:51:06 -0400 
Processing by DuelsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"/vNueb1U+W5asQ4/Vnh5kSdeUc6uiaUKvWG1TIaAKWY0fIM2ovLlsLJUSsmgDG3nTbFgt7n8zSYYT2LkZEqLrA==", "duel"=>{"duelers_attributes"=>{"0"=>{"user_id"=>"2"}, "1"=>{"user_id"=>"15"}}, "consequence"=>"t", "reward"=>"t"}, "dueler"=>{"challenge_id"=>"141"}, "button"=>""} 

только один challenge_id проходит через хотя должно быть два (один для каждого Dueler). Как я могу получить код ниже для вывода чего-то вроде этого на представить:

Started POST "/duels" for 127.0.0.1 at 2016-10-15 03:33:02 -0400 
Processing by DuelsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"xhbQpHgBmzfuvmYsyZx1Hss8CZBfQQN9+QCEciiq4yUMmT3rZ6eH6QZbIto/6GFoodM46Ug0a1FcLlPaymBB7w==", "duel"=>{"duelers_attributes"=>{"0"=>{"user_id"=>"2", "challenge_id"=>"141"}, "1"=>{"user_id"=>"15", "challenge_id"=>"143"}}, "consequence"=>"t", "reward"=>"t"}, "button"=>""} 

duels_controller

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) 
    @duel.duelers << Dueler.new(user_id: @user.id, user_name: @user.name, user_last_name: @user.last_name) 
    @current_user_challenges = current_user.challenges.order(:created_at) 
    @challenged_user_challenges = @user.challenges.order(:created_at) 
    respond_with(@duel) 
    end 

поединки/новые

<%= simple_form_for(@duel) do |f| %> 
    <%= f.fields_for(:duelers) do |dueler| %> 
    <%= render 'dueler_fields', :f => dueler %> 
    <% end %> 
    The loser will <%= f.text_field :consequence %> 
    <%= f.submit %> 
<% end %> 

_dueler_fields.html.erb

<%= f.select :user_id, User.order(:name).map { |user| [user.full_name, user.id] }, include_blank: true, id: "change-challenge-options" %> 

<div id="current-user-challenges"> 
    <%= f.collection_select :challenge_id, @current_user_challenges, :id, :full_challenge, include_blank: true %> 
</div> 

<div id="challenged-user-challenges"> 
    <%= f.collection_select :challenge_id, @challenged_user_challenges, :id, :full_challenge, include_blank: true %> 
</div> 

<script> # If current_user then I show first collection_select otherwise I show second. 
    var userSelect = $('#change-challenge-options'); 
    var currentUserId = $('#current-user-id').data('user-id'); 
    $('#challenged-user-challenges').hide(); 
    $('#current-user-challenges').hide(); 
    userSelect.on('change', function() { 
     if (userSelect.val() == "0"){ 
     $('#current-user-challenges').hide(); 
     $('#challenged-user-challenges').hide(); 
     } 
     else if (userSelect.val() == currentUserId) { 
     $('#current-user-challenges').show(); 
     $('#challenged-user-challenges').hide(); 
     } else { 
     $('#challenged-user-challenges').show(); 
     $('#current-user-challenges').hide(); 
     } 
    }); 
</script> 
+0

Я думаю, вам следует избавиться от этих JS и попробовать по-другому, например, поменять выбор, сделать аякс-вызов и получить данные и заполнить параметры выбора. Возможно, вы можете найти лучший способ, но, увидев, что JS чувствует, что вы создаете 2 варианта с тем же идентификатором, который не является стандартом HTML, и снова вы просто скрываете один из этих избранных, но скрытых полей по-прежнему отправляют свои данные при отправке формы. – Sajan

+0

Жаль, что я не очень хорошо разбираюсь в JS, как вы можете сказать @sajan. Не могли бы вы дать ответ своим предложением? Пожалуйста, умоляю вас, сэр! –

+0

Вы можете попробовать сначала, чтобы подтвердить это, это проблема JS. Удалите блок 'script' и' current-user-problems' div и попытайтесь отправить данные с этим и посмотрите, получаете ли вы 'params', как вы упомянули в вопросе. Если вам удалось получить параметры этого формата, мы можем увидеть о JS – Sajan

ответ

1

Если вы видите, что ваши параметры отправляются, вы действительно пропускаете два идентификатора. Один из участников с повышенным интересом и другой от претендента.

Вам просто нужно получить доступ к ним лучше в контроллере и сохранить его в соответствующем месте.

{ 
    "utf8" =>"✓", 
    "authenticity_token" =>"...", 
    "duel" => { 
    "duelers_attributes" => { 
     "0"  =>  { 
     "user_id"  =>"2", 
     "challenge_id"  =>"141" 
     }, 
     "1"  =>  { 
     "user_id"  =>"15", 
     "challenge_id"  =>"143" 
     } 
    }, 
    "consequence" =>"t", 
    "reward" =>"t" 
    }, 
    "button" =>"" 
} 

Я отделил линии для облегчения redability, но по существу в вашем создании или метод обновления вы можете получить доступ к duel_params["duel]["0"]["challange_id"] и сохранить его в любом месте вы хотите, то же самое для duel_params["duel]["1"]["challange_id"]

Вы также можете обновить тот или иной в обратном вызове активной записи, например метод after_save или after_validation, что лучше всего подходит для вас

+0

Вам нужно добавить эти поля в форму dueler_fields, по сути, если у вас есть что-то в вашей форме, оно будет передано в параметры. Вам нужно будет дезинфицировать его через safe_params, но – alexanderkustov

+0

Назовите f.collection_select: challenge_id иначе, будучи одним из претендентов и еще одним нападающим. Если простая форма не позволяет вам с тех пор, как на дуэли не существует целгера, то используйте простой тэг rails вместо simple_form. – alexanderkustov

+0

. Вы все равно можете передать тот же самый вызов в любую модель, которую хотите, просто запечатлите в этом активном обратном вызове и сохраните его соответствующее количество других пользователей – alexanderkustov