2013-12-15 3 views
1

Я делаю 2 формы, 1 для создания и 1 для редактирования. Форма создания отлично работает. Форма редактирования генерирует эту ошибкуRoutes.rb edit form redirect fail

No route matches [PATCH] "/admin/posts/14/edit" 

В форме, я думаю, проблема заключается в «патче». Я изменил это для «edit» и url admin_posts_path, как форма «create», но это создает новый элемент, а не редактирует текущий. Это мои грабли маршруты по этой части

   admin_posts GET /admin/posts(.:format)   admin/posts#index 
         POST /admin/posts(.:format)   admin/posts#create 
      new_admin_post GET /admin/posts/new(.:format)  admin/posts#new 
     edit_admin_post GET /admin/posts/:id/edit(.:format) admin/posts#edit 
       admin_post GET /admin/posts/:id(.:format)  admin/posts#show 
         PUT /admin/posts/:id(.:format)  admin/posts#update 
         DELETE /admin/posts/:id(.:format) 

И это форма или, по крайней мере, важная часть

<%= form_for :post, url: edit_admin_post_path(@post),:html => { :multipart => true }, method: :patch do |f| %> 
+0

так почему вы создаете отдельную форму для 'create' и' edit'? – Reboot

+0

потому что я не могу вычислить URL-адрес для формы, jajaja im sure i can not выяснить, что. jaja, но я буду, я не прошу –

+0

проверить мое решение ниже, возможно, оно может решить вашу проблему с помощью одной формы. – Reboot

ответ

1

edit действие только отвечает на запросы GET. Фактическое обновление выполняется в действии update, которое отвечает на PUT (или PATCH, если вы используете Rails 4).

Ваша правка форма должна начать с этого:

<%= form_for :post, url: admin_post_path(@post),:html => { :multipart => true }, method: :put do |f| %> 

Вы также могли бы упростить это:

<%= form_for @post, html: { multipart: true } do |f| %> 

Это автоматически устанавливает действие формы для PUT admin/posts/:id для существующих записей, и POST admin/posts для новых записей.

+0

Спасибо им, используя рельсы 3.2 –

+0

на самом деле я думаю, что урок, который я использовал для редактирования, предназначен для рельсов 4, в контроллере также есть строка с разрешением, которая теперь является проблемой «неопределенный метод« разрешение »(это для рельсов 4) правильно? –

+0

Если вы не привязаны к Rails 3.2, вы можете решить обновить до 4.В противном случае вам нужно использовать 'attr_accessible' в ваших моделях, как описано здесь: http://apidock.com/rails/ActiveRecord/Base/attr_accessible/class – fivedigit

1

edit_admin_post только для GET HTTP глагола.

Ваша информация должна содержать ссылку на PUT /admin/posts/:id, чтобы обновить сообщение.

изменить форму:

<%= form_for @post, { multipart: true } do |f| %> 

<% end %> 
+0

, так как я могу исправить это, или как (где) я могу изменить для публикации? –

+1

измените форму на <% = form_for @post do | f | %> <% end %> – SergeyKutsko

1

Если ваше действие create работает, вам не нужно передавать url для редактирования. Rails может определить, какой путь выбрать, вызывая метод new_record?. Если объект new_record, то рельсы будут использовать метод admin/posts#create, но если вы объект не new_record, чем рельсы будут использовать метод admin/posts#update. Таким образом, ваш контроллер будет выглядеть следующим образом

class Admin::PostsController < ApplicationController 
    def new 
    @post = Post.new 
    end 

    def create 
    //some code 
    end 

    def edit 
    @post = Post.find(params[:id]) 
    end 

    def update 
    //some code 
    end 
end 

и чем вы можете создать form как этого

form_for @post do |f| 
    //code here 
end 

Теперь рельсы могут автоматически определить, какой путь использовать для new поста и editing поста

+0

Вау, я действительно попробовал бы это, один вопрос .. в форме, они на самом деле одна и та же форма? wow thats cool, но как мне создать ссылку «Изменить» в каждом случае, если у меня нет редактирования .. и новый не указывает на id –

+0

ya с таким подходом вам не нужны две формы – Reboot

+0

извините, может быть, вы не см. мое редактирование в комментарии. «Это здорово, но как мне создать ссылку« Изменить »для каждого сообщения, если у меня нет редактирования .. и новый не указывает на идентификатор« –