我可以在Rails 4.2中使用`PUT`动词重定向

时间:2016-06-14 05:59:23

标签: ruby-on-rails-4

基本上我想使用PUT方法重定向到redirect_to控制器操作,但它只想使用GET动词。有没有办法在redirect_to

中指定HTTP谓词

路线定义为佣金路线

resume_user PUT    /users/:id/resume(.:format)  users#resume

并且我使用了以下所有结果No route matches [GET] "/users/5/resume"

  • redirect_to resume_user_url(@user)
  • redirect_to action:'resume',controller:'users',id:@ user.id
  • redirect_to action:'resume',controller:'users',method:'put',id:@ user.id

我可能错了,在这种情况下,有什么建议吗? 谢谢 帕特里克

4 个答案:

答案 0 :(得分:1)

standard不允许这样做。具有状态307的重定向禁止浏览器在遵循重定向时更改请求方法,但是没有用于请求特定方法的机制。

答案 1 :(得分:0)

这是一个古老的问题,但是要找到答案并不容易,所以... 如果您来自获取或发布请求,则可以更改添加方法的状态:303

 redirect_to resume_user_path(@user), status: 303

答案 2 :(得分:0)

我有和海报一样的场景,并通过以下方式解决了它。

[application_helper.rb]

  def parse_from_params(params, anc = nil)
    @tags || = []
    params.each do |row|
      key = if anc
              f, b = anc.split
              f + "\[#{row.first} \]" + b.to_s
            else
              row.first.to_s
            end
      if row.last.is_a?(Hash)
        parse_from_params(row.last, key)
      else
        @tags << hidden_field_tag(key.delete(' '), row.last)
      end
    end
    @tags.reduce(:+)
  end

[application_controller.rb]

  def redirect_keeped_params(url, **options)
    @url = url
    @params = options[:params]
    @method = options[:method]
    render_text = <<-EOS
      <%= form_tag @url, method: @method, id: "redirect_form" do %>
        <%= parse_from_params(@params) %>
        <%= javascript_tag 'document.getElementById("redirect_form").submit()' %>
      <% end %>
    EOS
    render inline: render_text
  end

使用示例...

[posts_controller.rb]

  def redirect_to_put_preparation
    post = Post.find(params[:id])
    params = {}
    params[:post] = {title: params[:title], body: params[:body]}
    # or params = post_params
    redirect_keeped_params(update_post_path(id: post.id), params: params, method: :put) 
  end

  def update_post
    post = Post.find(params[:id])
    post.update(post_params)
    flash[:notice] = "success"
    redirect_to root_path
  end

  def post_params
    params.require(:post).permit(:title, :body)
  end

答案 3 :(得分:-2)

尝试

redirect_to resume_user_url(@user), method: :put

我已尝试在链接上使用method: :post,但我还没有尝试使用redirect_to。