在我的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
哪个应该重定向到索引页面。
有没有有效的方法呢?
答案 0 :(得分:0)
HTTP重定向总是导致GET请求,而不是POST请求,因此重定向到update
并没有多大意义。这不是Rails问题,而是HTTP的工作方式。
如果您想自动更新相关记录,则必须在create
操作中执行此操作。直接但懒惰的方法是从更新中复制代码并将其粘贴到if
内的create
分支中。更正确的方法是将update
的相关部分提取到一个单独的私有方法中,然后从create
和update
调用该方法,例如:
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