在redirect_to rails中转发post参数

时间:2016-09-23 16:04:26

标签: ruby-on-rails ruby controller url-redirection ruby-on-rails-5

在我的rails应用程序中,我希望用户能够以“新”形式选择一个选项,但如果该选项已存在,我希望它能够更新当前选项。

到目前为止,我的创建方法中有这个:

Error: '(StudentSchoolYear/StudentClass[@PeriodBegin=’1’])' has an invalid token.

问题在于它将我重定向到例如def create @cost = Cost.new(cost_params) if Cost.exists?(:category => @cost.category, :option => @cost.option) redirect_to action: 'update', id: Cost.where(:category => @cost.category, :option => @cost.option).first.id else respond_to do |format| if @cost.save format.html { redirect_to action: 'index', status: 303, notice: [true, 'Cost was successfully created.'] } format.json { render json: @cost, status: :created, location: @cost } else format.html { render action: "new" } format.json { render json: @cost.errors, status: :unprocessable_entity } end end end end url,这会呈现显示页面。我想将id与cost_params直接发送到更新方法:

cost/9

哪个应该重定向到索引页面。

有没有有效的方法呢?

1 个答案:

答案 0 :(得分:0)

HTTP重定向总是导致GET请求,而不是POST请求,因此重定向到update并没有多大意义。这不是Rails问题,而是HTTP的工作方式。

如果您想自动更新相关记录,则必须在create操作中执行此操作。直接但懒惰的方法是从更新中复制代码并将其粘贴到if内的create分支中。更正确的方法是将update的相关部分提取到一个单独的私有方法中,然后从createupdate调用该方法,例如:

def create
  @cost = Cost.new(cost_params)

  if Cost.exists?(:category => @cost.category, :option => @cost.option)
    @cost = Cost.where(:category => @cost.category, :option => @cost.option).first
    really_update
  else
    respond_to do |format|
      if @cost.save
        format.html { redirect_to action: 'index', status: 303, notice: [true, 'Cost was successfully created.'] }
        format.json { render json: @cost, status: :created, location: @cost }
      else
        format.html { render action: "new" }
        format.json { render json: @cost.errors, status: :unprocessable_entity }
      end
    end
  end
end 

def update
  @cost = Cost.find(params[:id])
  really_update
end

private def really_update
  respond_to do |format|
    if @cost.update_attributes(cost_params)
      format.html { redirect_to action: 'index', status: 303, notice: [true, 'Cost was successfully updated.'] }
      format.json { head :no_content }
    else
      format.html { render action: "edit" }
      format.json { render json: @cost.errors, status: :unprocessable_entity }
    end
  end
end