当我尝试更新帖子时,我收到以下错误:"没有路由匹配[POST]' / posts / id / edit /'"。我的代码几乎与几个在线教程相匹配。它应该更新post params然后重定向回index。我不知道为什么会收到此错误?
在我的控制器里,我有,
def update
@post = post.find(params[:id])
if @post.update_attributes(params[:post])
redirect_to action: :index
flash[:notice] = 'post was updated.'
else
render 'edit'
end
end
def edit
@post = post.find(params[:id])
end
在index.html中,我有一个编辑功能按钮。
<td><%= button_to "Edit", edit_post_path(c.id ), { :method => :get } %></td>
在edit.html中,我有这段代码。
<%= form_for :post do |c| %>
<p>
<%= c.label :post_name %><br/>
<%= c.text_field :post_name %><br/>
<%= c.submit "Save changes" %>
<% end %>
帖子路线:
posts_path GET /posts(.:format) posts#inde
POST /posts(.:format) posts#create
new_post_path GET /posts/new(.:format) posts#new
edit_post_path GET /posts/:id/edit(.:format) posts#edit
post_path GET /posts/:id(.:format) posts#show
PATCH /posts/:id(.:format) posts#update
PUT /posts/:id(.:format) posts#update
DELETE /posts/:id(.:format) posts#destroy
答案 0 :(得分:0)
你应该使用link_to
<td><%= link_to "Edit", edit_post_path(c.id ) %></td>
button_to创建一个包含单个按钮的表单,该按钮会发布到网址。
使用get button_to
(不建议,因为按钮应该发布POST)
<td><%= button_to "Edit", edit_post_path(c.id ), :method => :get %></td>
答案 1 :(得分:0)
添加一个额外的括号,因为该方法在第四个参数中被指定为选项:
<td><%= button_to "Edit", edit_post_path(c.id ), {}, { :method => :get } %></td>
答案 2 :(得分:0)
我知道你有
form_for :post
可能必须是
form_for @post
由于无法理解,因此可能会认为它是新记录而不是现有记录,因此会自动定义导致创建操作的网址,只需更改:post to @post
答案 3 :(得分:0)
以下是我最终解决此问题的方法。 edit.html.erb已更改为:
<%= form_for :post, { :url => post_path, method => :patch } do |c| %>
<p>
<%= c.label :post_name %><br/>
<%= c.text_field :post_name %><br/>
<%= c.submit "Save changes" %>
<% end %>
帖子控制器有以下变化:
def update
@post = post.find(params[:id])
if @post.update_attributes(params.require(:post).permit(:post_text))
redirect_to action: :index
flash[:notice] = 'post was updated.'
else
render 'edit'
end
end
def edit
@post = post.find(params[:id])
end