Rails编辑和更新操作

时间:2015-05-05 14:21:31

标签: ruby-on-rails actioncontroller

当我尝试更新帖子时,我收到以下错误:"没有路由匹配[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

4 个答案:

答案 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