Как правильно изменить параметры, передаваемые контроллеру в rails 3.1.0? - PullRequest
0 голосов
/ 26 января 2012

В нашем приложении Rails 3.1.0 нам нужно изменить параметры, передаваемые в контроллер rfq при создании и обновлении.Например, мы хотим записать текущий идентификатор пользователя в input_by_id.То, что мы сделали:

  @rfq.input_by_id = session[:user_id]

Это сработало, как и ожидалось.Также, когда поле need_report равно false, тогда поле report_language должно быть равно nil.Мы решили добавить следующую строку в контроллер rfq, чтобы убедиться, что nil передается в report_language, когда need_report имеет значение false:

  @rfq.report_language = nil unless params[:need_report]

Однако это добавление вызывает сбой в случае rspec (при создании / обновлении контроллера)из-за сбоя проверки данных.Однако когда мы запускаем приложение, оно работает нормально, не сохраняя report_language, когда need_report имеет значение false.Мне интересно, не является ли указанная выше строка неправильным способом использования params [: need_report] для обновления @rfq.

Большое спасибо.

ОБНОВЛЕНИЕ:

Код контроллера:

  def create
    if has_create_right?
      @rfq = Rfq.new(params[:rfq], :as => :roles_new )
      @rfq.input_by_id = session[:user_id]
      #save sales_id selected
      if sales? && member? && !team_lead?
        @rfq.sales_id = session[:user_id]        
      end
      #view page may carry the hidden report language even if need_report == false
      @rfq.report_language = nil unless params[:need_report]
      #save into join table rfqs_standards
      params[:rfq][:standard_ids].each do |sid|  
        @rfq.standards << Standard.find(sid.to_i) if !sid.nil? && sid.to_i > 0 
      end unless params[:rfq][:standard_ids].nil?
      #save into join table rfqs_test_items
      params[:rfq][:test_item_ids].each do |tid|
        @rfq.test_items << TestItem.find(tid.to_i) if !tid.nil? && tid.to_i > 0 
      end unless params[:rfq][:test_item_ids].nil?
      if @rfq.save!
        redirect_to URI.escape("/view_handler?index=0&msg=RFQ saved!")
      else
        flash.now[:error] = "RFQ not saved!"
        render 'new'
      end
    else
       redirect_to URI.escape("/view_handler?index=0&msg=No rights!") 
    end
  end

Сбой теста после добавления @rfq.report_language = nil unless params[:need_report]

   it "should be successful for corp head" do
      session[:corp_head] = true
      session[:user_id] = 1
      s = Factory(:standard)
      rfq = Factory.attributes_for(:rfq, :need_report => true, :report_language => 'EN')
      rfq[:standard_ids] = [s.id] # attach standard_id's to mimic the POST'ed form data
      get 'create', :rfq => rfq
      #response.should redirect_to URI.escape("/view_handler?index=0&msg=RFQ saved!")
      response.should render_template('new')
    end

1 Ответ

1 голос
/ 26 января 2012

проблема в том, что вы просто не смотрите на правильное значение.

get 'create', :rfq => rfq приведет к хешу params, подобному {:rfq => {...}}

так что вам нужно @rfq.report_language = nil unless params[:rfq][:need_report] == 'true'

...