【问题标题】:How to redirect_to or render new action with a HTTP GET method instead of POST?如何使用 HTTP GET 方法而不是 POST 重定向或呈现新操作?
【发布时间】:2014-12-08 17:12:11
【问题描述】:

我收到此错误:没有路由匹配 [POST] "/posts/5/cmets/new"。

如何重定向到我的帖子/cmets/new 路由 ( /posts/:post_id/cmets/new(.:format) ) 的 GET 操作而不是 POST??

这是我对 cme​​ts 控制器的创建操作:

def create
   def create
      @post = Post.find(params[:post_id])
      @comment = @post.comments.create(comment_params)
      @comment.user_id = current_user.id #or whatever is you session name
    if @comment.save
      redirect_to @post
    else

      redirect_to new_post_comment_path
    end
      end
        end

如果您查看错误消息,您可以看到我的创建操作正在寻找我的 new_post_comment_path 路由的 POST 版本,而它应该是 GET。

rake 路由的一些输出:

POST    /posts/:post_id/comments(.:format)  comments#create
new_post_comment_path   GET     /posts/:post_id/comments/new(.:format)  comments#new 

我的路线是怎么做的:

resources :posts do
  member do
    put "like", to: "posts#upvote"
    put "dislike", to: "posts#downvote"
  end
  resources :comments
end

评论_form.html.erb:

<%= form_for @comment, url: {action: "new"}, html: {class: "nifty_form"} do |f| %>

  <%= f.text_area :body, size: "40x12" %>
  <%= f.submit "Add Comment" %>
<% end %>

当我将操作从新更改为创建时,我收到一条新的缺少模板错误消息:

缺少模板 cmets/create, application/create with {:locale=>[:en], :formats=> [:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}。在以下位置搜索:*“app/views”*“.rvm/gems/ruby-2.1.2/gems/devise-3.3.0/app/views”

评论new.html.erb

<h1>New Comment</h1>
<%= render 'comments/form' %>

感谢您的帮助。

【问题讨论】:

  • 你的帖子和cmets模特有关系吗?请在此处添加您的 routes.rb 文件
  • 您是否在另一个 create 方法中定义了 create 方法?

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


【解决方案1】:

在 RESTful 环境中,您不能使用 POST 动词来达到控制器上的“新”操作。如果您对路线感到困惑,请记住使用命令 rake routes 直到您习惯它们为止。

不管怎样,我不太明白你的问题。如果您想重定向到新操作,它将始终使用 GET,所以它应该足够了:

redirect_to new_post_comment_path(@post)

我错过了什么吗?

【讨论】:

  • 我之前有过那个代码,它得到了同样的错误。我仔细检查了一遍。我将在问题中编辑更多信息。
  • 请注意我错过了帖子前面的@符号,也许就这么简单。
  • 您确定错误在控制器中吗?你的表格是什么样子的?也许你也可以粘贴日志输出
  • 我刚刚添加了它。当我将“new”更改为“create”时,我在编辑中收到一条新的错误消息
  • 正如我所想,您的问题在表格中。您正在使用表单中的 POST 方法将请求发送到操作 :new,这没有任何意义。试试这个:form_for [@post, @comment] 删除 url 部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 2011-02-15
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
相关资源
最近更新 更多