2015-09-16 2 views
0

Я пытаюсь использовать форму для редактирования объекта «Матч», в частности атрибуты team1 и team2, которые являются ссылками на объекты Team. Но я все время получаю ошибкуRails options_from_collection_for_select бросать ожидаемый объект, получил ошибку строки

Team(#70077411807740) expected, got String(#18738520) 

Я связал это неправильно? Я передаю неправильное значение в options from collection_for_select?

Форма сама по себе прекрасно выглядит и отображает сохраненную команду.

модели/team.rb:

class Team < ActiveRecord::Base 
    has_many :matches 
end 

модели/match.rb:

class Match < ActiveRecord::Base 
    belongs_to :team1, class_name: 'Team' 
    belongs_to :team2, class_name: 'Team' 
end 

Контроллеры/matches_controller.rb:

def update 
    if !current_admin 
    flash[:alert] = "You are not authorised for that action" 
    redirect_to matches_path 
    else 
    puts "The updated match parameters are:" 
    puts match_params.inspect 
    @match.update(match_params) 
    redirect_to edit_match_path(@match.id) 
    end 
end 

private 

def match_params 
    params.require(:match).permit(:round_id, :pool_id, :name, :short_name, :date, :venue_id, :team1, :team2, :knockout_desc1, :knockout_desc2, :team1_score, :team1_tries, :team1_points, :team2_score, :team2_tries, :team2_points, :winner, :tries, :margin_id, :played) 
end 

просмотров/совпадет/_form.html .erb:

<div class="container"> 

    <h1 class="text-center">Edit Match <%= @match.id %></h1> 


    <%= form_for(@match) do |f| %> 
     <% if @match.errors.any? %> 
     <div id="error_explanation"> 
      <h2><%= pluralize(@match.errors.count, "error") %> prohibited this match from being saved:</h2> 

      <ul> 
      <% @match.errors.full_messages.each do |message| %> 
      <li><%= message %></li> 
      <% end %> 
      </ul> 
     </div> 
     <% end %> 

     <div class="form-section"> 

     <div class="row text-center bottom-buffer-small"> 

      <div class="col-sm-5"> 
      <span class="header-1">Team 1</span> 
      </div> 

      <div class="col-sm-2"> 

      </div> 

      <div class="col-sm-5"> 
      <span class="header-1">Team 2</span> 
      </div> 

     </div> 

     <div class="row text-center bottom-buffer-small">   

      <div class="col-sm-5"> 

      <% if f.object.team1.nil? %> 
       <%= f.select :team1, options_from_collection_for_select(@teams, 'id', 'name') %> 
      <% else %> 
       <%= f.select :team1, options_from_collection_for_select(@teams, 'id', 'name', f.object.team1.id) %> 
      <% end %> 

      </div> 

      <div class="col-sm-2"> 
      <b>v</b> 
      </div> 

      <div class="col-sm-5"> 

      <% if f.object.team1.nil? %> 
       <%= f.select :team2, options_from_collection_for_select(@teams, 'id', 'name') %> 
      <% else %> 
       <%= f.select :team2, options_from_collection_for_select(@teams, 'id', 'name', f.object.team2.id) %> 
      <% end %> 

      </div> 

     </div> 

     </div> 


     <div class="actions"> 
     <%= f.submit %> 
     </div> 
    <% end %> 


    <%= link_to 'Show', @match %> | 
    <%= link_to 'Back', matches_path %> 

</div> 

Ошибка:

 Team(#70077413116680) expected, got String(#18738520) 

     Extracted source (around line #51): 
     49 
     50 
     51 
     52 
     53 
     54 

       puts "The updated match parameters are:" 
       puts match_params.inspect 
       @match.update(match_params) 
       redirect_to edit_match_path(@match.id) 
      end 
      end 

     Rails.root: /home/alzer/workspace/pawchallenge 

     Application Trace | Framework Trace | Full Trace 
     app/controllers/matches_controller.rb:51:in `update' 
     Request 

     Parameters: 

     {"utf8"=>"✓", 
     "_method"=>"patch", 
     "authenticity_token"=>"SwlPKcm0grrgfggghkjdjhgjhg00s7767hsjkjkAGhzGwE2GbByFUi39p7ZI=", 
     "match"=>{"team1"=>"11", 
     "team2"=>"12"}, 
     "commit"=>"Update Match", 
     "id"=>"1"} 
+0

Сортировано его. Мне понадобилось следующее: <% = f.select: team1_id, options_from_collection_for_select (@teams, 'id', 'name')%> '. Я также должен был разрешить ': team1_id' через сильные параметры. Должен ли я удалить вопрос? –

+0

Я думаю, что он должен @ match.update_attributes (match_params) –

+1

@AlD Я бы опубликовал ваше решение в качестве ответа и принял его, чтобы другие знали, что оно было разрешено. –

ответ

0

Хорошо я отсортирован это. Мне нужно было изменить <%= f.select :team1 на <%= f.select :team1_id и т. Д. (См. Приведенный ниже код). Я также необходимо, чтобы позволить :team1_id через как сильный paramamter в контроллере можно здесь: -

def match_params 
    params.require(:match).permit(:name, :short_name, :date, :venue_id, :team1_id, :team2_id,..........) 
    end 

Мои views/matches/_form.html.erb: сейчас выглядит так: -

<div class="row text-center bottom-buffer-small">   

     <div class="col-sm-5"> 

     <% if f.object.team1.nil? %> 
      <%= f.select :team1_id, options_from_collection_for_select(@teams, 'id', 'name') %> 
     <% else %> 
      <%= f.select :team1_id, options_from_collection_for_select(@teams, 'id', 'name', f.object.team1.id) %> 
     <% end %> 

     </div> 

     <div class="col-sm-2"> 
     <b>v</b> 
     </div> 

     <div class="col-sm-5"> 

     <% if f.object.team2.nil? %> 
      <%= f.select :team2_id, options_from_collection_for_select(@teams, 'id', 'name') %> 
     <% else %> 
      <%= f.select :team2_id, options_from_collection_for_select(@teams, 'id', 'name', f.object.team2.id) %> 
     <% end %> 

     </div> 

    </div>