1

у меня есть кратные формы в окне редактирования, как вы можете увидеть ниже:Не удалось найти [модель] без ID - Рубин на рельсы

Посмотреть

[email protected] do |post| 
    .form 
    = simple_form_for post, url: update_posts_path do |f| 
     = f.input :title 
     = f.submit 

Затем, когда я обновляю любой form Я получаю эту ошибку «Не удалось найти горшки без идентификатора». Вы можете видеть контроллер и файл здесь маршруты:

Контроллер

def update 
    @post = Posts.find(params[:id]) //If I change it for Posts.first then is working 
    if @post.update_attributes(params.require(:posts).permit(:title)) 
    redirect_to .... 
    else 
    flash[:notice] = "Sorry." 
    render :edit 
    end 
end 

Маршруты Файл

resources :posts, :only => [:index, :edit, :update] do 
    get "edit", :on => :collection, :as => :edit 
    patch "update", :on => :collection, :as => :update 
end 

Я думаю, что ошибка в том, что по какой-то причине это (@post = Posts.find (params [: id])) возвращает объект nil, тогда контроллер не может его обновить. Может кто-нибудь дать мне руку?

+0

Вы уверены, что о вашей модели будучи 'Posts' с' s' в конце? – mdemolin

+0

Спасибо, это было и ошибка, теперь в единственном числе. – darkcode

ответ

4

Ошибка :on => :collection часть. Это позволяет вызывать действие без id, поэтому params[:id] пуст.

:on => :collection обычно используется для индексирования как действия, которые в результате имеют набор записей, поэтому не требуется идентификационная часть.

кстати: все дело:

get "edit", :on => :collection, :as => :edit 
patch "update", :on => :collection, :as => :update 

является избыточным, то первая строка:

resources :posts, :only => [:index, :edit, :update] 

говорит Rails все, что необходимо.

0

Для действия обновлений вы используете :on => :collection но запрос поставлен запрос/патч, так что вы будете использовать patch "update", :on => :member, :as => :update также вносить изменения в form_for согласно вашему route.Use <%=simple_form_for post ,:url=> update_post_path(post) do |f| %> вместо url: update_posts_path

Что касается params.require(:posts).permit(:title)

  1. Первая проблема: вы используете posts вместо post
  2. второй параметр :id отсутствует

вы будете использовать params.require(:post).permit(:title,:id) вместо params.require(:posts).permit(:title)

Смежные вопросы