简体   繁体   English

修改在Rails 3.1.0中传递给控制器​​的参数的正确方法是什么?

[英]What's the right way to modify the params passed to controller in rails 3.1.0?

In our Rails 3.1.0 app, we need to modify params passed to rfq controller in create and update. 在我们的Rails 3.1.0应用程序中,我们需要在创建和更新时修改传递给rfq控制器的参数。 For example, we want to record the current user id under input_by_id. 例如,我们想将当前用户ID记录在input_by_id下。 What we did was: 我们所做的是:

  @rfq.input_by_id = session[:user_id]

It worked as expected. 它按预期工作。 Also when need_report field is false, then report_language field should be nil. 同样,当need_report字段为false时,report_language字段也应该为nil。 We decide to add the following line in rfq controller to make sure the nil is passed to report_language when need_report is false: 我们决定在rfq控制器中添加以下行,以确保在need_report为false时将nil传递给report_language:

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

However this addition causes the rspec case failure (in create/update of the controller) because of the data validation failure. 但是,由于数据验证失败,此添加会导致rspec案例失败(在控制器的创建/更新中)。 However when we fire up the app, it behaves fine without saving the report_language when need_report is false. 但是,当我们启动该应用程序时,当need_report为false时,它无需保存report_language即可正常运行。 I am wondering if the line above is not the right way to use params[:need_report] for @rfq updating. 我想知道上面的行是否不是使用params [:need_report]进行@rfq更新的正确方法。

Thanks so much. 非常感谢。

UPDATE: 更新:

Controller code: 控制器代码:

  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

Test case failed after addition of @rfq.report_language = nil unless params[:need_report] 添加@rfq.report_language = nil unless params[:need_report]后,测试用例失败, @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

the problem ist that you are simply not looking at the right value. 问题在于您根本就没有在看正确的价值。

get 'create', :rfq => rfq will result in a params-hash like {:rfq => {...}} get 'create', :rfq => rfq将导致类似{:rfq => {...}}的参数哈希

so you need to @rfq.report_language = nil unless params[:rfq][:need_report] == 'true' 因此, @rfq.report_language = nil unless params[:rfq][:need_report] == 'true'您需要@rfq.report_language = nil unless params[:rfq][:need_report] == 'true'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM