代码之家  ›  专栏  ›  技术社区  ›  naspinski

为什么我的控制器/操作没有响应A:Put?

  •  0
  • naspinski  · 技术社区  · 15 年前

    我试着遵守规则,保持安静,但我遇到了一些问题。

    我设定了我的路线,这样当我跑步时,我确信它在呼唤正确的动作。 耙路 这就是:

    PUT /admin/settings {:controller=>"admin", :action=>"save_settings"}
    

    所以我知道我的路线是正确的,在我的*views/admin/settings.html.erb“我有以下内容:

    <% form_for(:settings, :html => { :method => :put },:builder => MyFormBuilder) do |f| %>
    

    一切似乎都表现得很好(因为铁轨绕着一个铅字跳舞):

    <form action="/admin/settings" method="post">
    <input name="_method" type="hidden" value="put" />
    

    但是当我实际单击提交按钮时,什么都没有发生。为了测试,我只做了一个 闪光 :

    # PUT admin/settings
    def save_settings
      flash[:notice] = 'Settings Saved'
      render :action => 'settings'
    end
    

    没有闪现。我想我把基地都盖在这里了,但我一定忘了什么。请帮助解决一个错误:noob:)

    2 回复  |  直到 15 年前
        1
  •  1
  •   Jagira    15 年前

    您要么按照Steve所说的做,要么如果您坚持在表单生成器中提到请求类型,那么您应该使用正确的语法。

    试试这个

    `<% form_for :post, @post, :url => post_path(@post), :html => { :method => :put, :class => "edit_post", :id => "edit_post_45" } do |f| %>`
    

    这是从Rails的文档中获取的。第一个参数是对象的名称(大多数情况下设置在您的案例/模型类名中),第二个参数是将存储表单数据的实例变量(您在“编辑”操作中使用的变量的名称,在URL中,您可以使用URL帮助器,也可以手动指定控制器和操作,“放置”动词将进入HTML选项离子散列。

    遵循这个步骤,看看它是否有效。

        2
  •  2
  •   Steve Weet    15 年前

    设置flash后,您需要再次呈现设置页面,否则不会重新绘制页面,因为您没有给浏览器任何新内容。

    一个“标准”的restful控制器更新操作看起来像这样

      def update
        @device = Device.find(params[:id])
        if @device.update_attributes(params[:device])
          flash[:notice] = "Successfully updated device."
          redirect_to @device
        else
          render :action => 'edit'
        end
      end
    

    因此,您应该向save_settings方法添加一个渲染,或者重新定向到自身。