0

私は持っている...

/app/models/survey.rb :

class Survey < ActiveRecord::Base

  has_many :results
  belongs_to :competitor
  after_commit :create_matching_results  
  attr_accessible :results_attributes
  accepts_nested_attributes_for :results
  after_commit :create_matching_results
  def create_matching_results
    unless self.destroyed?
      self.fields.each do |field|
        result = survey.results.find_or_create_by_survey_id_and_field_id(self.id, field_id)
        result.update_attributes :competitor_id => competitor.id
      end
    end
  end
end

/app/models/result.rb :

class Result < ActiveRecord::Base
  attr_accessible :field_id, :survey_id, :competitor_id, :value, :selected, :name
  belongs_to :survey
end

/app/controllers/surveys_controller.rb :

class SurveysController < ApplicationController  
  def edit
    @competitor = Competitor.find(params[:competitor_id])
    @survey = @competitor.surveys.find(params[:id])
  end
  def update
    @competitor = Competitor.find(params[:competitor_id])
    @survey = @competitor.surveys.find(params[:id])
    @result_ids = params[:survey]["result_ids"]
    @survey.results.each do |result|
      result.update_attributes :selected => true if result.id == @result_ids.to_i
      result.update_attributes :selected => false unless result.id == @result_ids.to_i
    end
    flash[:notice] = "Survey was successfully updated. (#{undo_link(@survey)}.)" if @survey.update_attributes(params[:survey])
    respond_with(@competitor, @survey)
  end
end

/app/views/surveys/_form.html.haml :

= simple_form_for [@competitor, @survey] do |f|
  = f.collection_radio_buttons :result_ids, @survey.results, :id, :name
  = f.button :submit, :id => 'submit_survey'

ここで、@survey.results.count == 2 と仮定します。次に、フォームに次のような素敵な HTML を取得します。

<form accept-charset="UTF-8" action="/competitors/13/surveys/80" class="simple_form edit_survey" id="edit_survey_80" method="post" novalidate="novalidate">
  <input id="survey_result_ids_673" name="survey[result_ids]" type="radio" value="673" />
  <label class="collection_radio_buttons" for="survey_result_ids_673">one</label>
  <input id="survey_result_ids_672" name="survey[result_ids]" type="radio" value="672" />
  <label class="collection_radio_buttons" for="survey_result_ids_672">two</label>
  <input class="btn" id="submit_survey" name="commit" type="submit" value="Update Survey" />
</form>

ここまでは順調ですね。

これら 2 つのラジオ ボタンのいずれかを選択すると、パラメータは次のようになります。

{"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"etc...",
 "survey"=>{"result_ids"=>"672"},
 "commit"=>"Update Survey",
 "action"=>"update",
 "controller"=>"surveys",
 "competitor_id"=>"13",
 "id"=>"80"}

その結果、 の値が に設定され、他の結果の値が に設定されることを期待selectedしていResult.find(672)ます。代わりに、他の結果が完全に削除されていることがわかりました。どうしたの?どうすれば修正できますか?trueselectedfalse

更新

たとえば、私は から始め@survey.results.count == 4ますresults.selected == false。次に、Rspec で次のことを行います。

visit edit_competitor_survey_path(@competitor, @survey)
  choose "Standard practice"
  @dummy = @survey.results.map{|result| [result.name, " - ", result.selected].join}
  click_on "submit_survey"
  @survey.results.reload.map{|result| [result.name, " - ", result.selected].join}.should == @dummy

私はそれから得ます:

Failure/Error: @survey.results.reload.map{|result| [result.name, " ", result.selected].join}.should == @dummy
       expected: ["Best practice - false", "Good practice - false", "Standard practice - false", "Bad practice - false"]
            got: ["Standard practice - true"] (using ==)

('before' と 'after' の値が等しいとは思っていません。このトリックは、Rspec テスト失敗メッセージで両方の値を表示する便利な方法です。)

4

1 に答える 1