0

我有以下控制器(非常基本)。

class ActivityTypesController < ApplicationController
  respond_to :html

  def show
    @model=ActivityType.find(params[:id])
    respond_with @model
  end

  def new
    @folder = Folder.find(params[:folder_id])
    @model = @folder.activity_types.build
    respond_with @folder, @model
  end

  def create
    @folder = Folder.find(params[:folder_id])
    @model = @folder.activity_types.build(params[:activity_type])

    if @model.save
      flash[:notice] = 'hoorraaaaayyy'
    end

    respond_with @folder, @model, location: root_path
  end

  def edit
    @folder = Folder.find(params[:folder_id])
    @model = ActivityType.find(params[:id])
    respond_with @folder, @model
  end

  def update
    @folder = Folder.find(params[:folder_id])
    @model = @folder.activity_types.find(params[:id])

    if @model.update_attributes(params[:activity_type])
      flash[:notice] = 'yeeeeaaaaaaah'
    end

    respond_with @folder, @model, location: root_path
  end

有趣的是:动作中的:location选项#create被忽略,而在动作中#update,它被尊重。

我不知道,为什么会这样。更奇怪的是:当删除 inside 时,它​​似乎停留在:location动作上并呈现视图,而不是重定向到视图。#create#updateedit#show

有谁知道我如何追踪这个问题?

4

1 回答 1

1

我发现了问题。

我们有一个activity_types/create.html.haml仅呈现_form.html.haml部分视图的视图(这似乎是先前不干净的实现或新/创建操作组合的解决方法的遗留物)。

因为respond_with总是首先检查相应的视图,所以在创建之后,它会渲染create看起来与edit操作相同的视图。因此,如果您也遇到类似的情况,请确保您没有任何阻止respond_to重定向到任何其他操作的视图。

顺便说一句:如果您只接受:html请求,那么您只需要在and操作respond_with中调用,因此它会在出现错误时自动呈现and表单。但是,如果您想提供例如 JSON 或 XML 并拥有,那么您也需要在操作中使用 a (以及任何其他应使用数据响应调用的操作)。createupdateneweditrespond_to :xmlrespond_with @my_model#showmy_action.xml

于 2012-11-20T12:16:15.223 回答