【问题标题】:Rails 4: what is wrong with this method?Rails 4:这种方法有什么问题?
【发布时间】:2013-06-10 13:43:57
【问题描述】:

我正在将应用程序升级到 Rails 4,但我终其一生都无法弄清楚这种方法有什么问题。违规者的更新方法:

def update
  respond_to do |format|
    if @doc.articles.find_index { |a| a.changed? }
      @doc.publications.destroy_all
    end
    if @doc.update_attributes(params[:doc])
      @doc.create_activity :update, owner: current_user
      if current_user.brand.editable? && params[:editing]
        format.html { redirect_to editing_url(@doc) }
      else 
        format.html { redirect_to share_url(@doc.user.ftp, @doc) }
      end
    end
  end
end

点击submit会产生这个错误:

ActionController::UnknownFormat in DocsController#update

并突出显示这一行:

respond_to do |format|

create 方法运行良好,如下所示:

def create
  @doc = Doc.new(params[:doc])
  respond_to do |format|
    if @doc.save
      @doc.create_activity :create, owner: current_user
      if current_user.brand.editable? && params[:editing]
        format.html { redirect_to doc_editing_url(@doc) }
      else 
        format.html { redirect_to share_url(@doc.user.ftp, @doc) }
      end
    else
      format.html { render action: "new" }
    end
  end
end

有什么想法吗?我完全被困住了。

哦,我也有这个私有方法作为 before_action,所以不是这样:

private

def set_document
  @doc = Doc.find(params[:id])
end

编辑

我找到了这个准解释:

在 Rails 4.0 中,ActionController::UnknownFormat 在 action 不处理请求格式。默认情况下,例外是 通过响应 406 Not Acceptable 来处理,但您可以覆盖 现在那个。在 Rails 3 中,总是返回 406 Not Acceptable。不 覆盖。

这让我觉得这与路由有关,但如果我这样声明它们,我的路由应该是默认的,是吗?

resources :docs, :except => [:new, :show] do
  get "adjust/:state" => "docs#adjust", :as => :adjust
  patch "editing" => "docs#editing", :as => :editing
  patch "reupdate/" => "docs#reupdate", :as => :reupdate
  get "pdf" => "docs#pdf", :as => :pdf
  collection { post :sort }
end

编辑 2

将 JSON 添加到控制器,即:

format.html { redirect_to share_url(@doc.user.ftp, @doc) }
format.json { render action: 'share', status: :created, location: @doc }

给我一​​个无方法错误,似乎将我重定向回编辑页面:

Showing .../fin/app/views/docs/_form.html.erb where line #19 raised:
undefined method `covers?' for nil:NilClass

真的不知道这里发生了什么。

【问题讨论】:

  • 您的表单上有remote: true 吗?是通过JS发送的吗?你的控制器中有respond_to :json 吗?
  • 表单中没有remote: true,也不是通过JS发送的。我的控制器中没有respond_to :json,因为据我所知我不需要它。

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

如果您只提供 HTML,那么您根本不需要 respond_toformat.html

【讨论】:

    【解决方案2】:

    一个可能的原因是,如果@doc.update_attributes(params[:doc]) 返回false,则更新方法中没有执行格式块。

    在这种情况下,您通常会呈现 edit 操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-08
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多