2014-12-01 3 views
0

Я хочу обновить существующее название и описание. Мои элементы вызываются todo, а база данных - todos (поскольку я генерирую с помощью commant comm). Код, который я имею edit.html.erb:Ruby on Rails путь понимания

<%= form_for :session, url: todos_path(@todo), method: :patch do |f| %> 
    <%= f.label :title %> 
    <%= f.text_field :title %> 

    <%= f.label :description %> 
    <%= f.text_field :description %> 
    <br /> 


    <%= f.submit "Create" %> 

<% end %> 

routes.rb:

get "/todos", to: "todos#index" 
    get "/todos/new", to: "todos#new" 
    post "/todos", to: "todos#create" 
    delete "/todos/delete" , to: "todos#delete" 
    get "/todos/three", to: "todos#three" 
    post "/todos/edit", to: "todos#edit" 
    patch "/todos/edit", to: "todos#update" 

    # You can have the root of your site routed with "root" 
    root 'todos#index' 

и, наконец, контроллер:

def edit 
    @todo = Todo.find_by_id(params[:id]) 
    end 

    def update 
    todo = Todo.find_by_id(params[:session][:id]) 
    todo.update(:description,params[:session][:description]) 
    end 

Моей проблема: я пришел с индексной страницы с идентификатором, и функция редактирования отобразит мне элемент, который я хочу, затем я хочу обновить поле названия и описания и нажать кнопку f.submit, чтобы обновить его. Моя проблема в том, что параметры не появляются, я получаю todos.2 (что, я думаю, это размер этого: session hash?). Я не использую <% = button_to%> так как я видел, что это не нужно во всех учебниках. Мой вопрос: где моя ошибка, почему параметры не поступают?

ответ

1

Изменение маршрутов к этому:

patch "/todos/edit/:id", to: "todos#update", as: :update_todo 

затем образуют:

<%= form_for :session, url: update_todo_path(id: @todo.id), method: :patch do |f| %> 

, а затем контроллер:

def update 
    todo = Todo.find(params[:id]) 
    todo.update_attributes(params[:session].slice(:description)) 
end 

Однако я бы рекомендовал вам придерживаться конвенции вместо написания и определения ваших собственных именованных маршрутов для таких целей.

+0

, да, я планирую придерживаться конвенции. Однако, чтобы понять, как они работают, я считаю, что сначала должен сделать свой собственный (я, очевидно, новичок). Я получаю сообщение об ошибке с вашим кодом неопределенной локальной переменной или методом update_todo –

+0

@LucianTarna: К сожалению, это была опечатка. Отсутствует ':' в 'update_todo'. Исправлено сейчас, оно должно работать. – Surya

+0

Да, я видел. Проблема в том, что он не получит todo.update_attributes (params [: session] .slice (: description)). ActiveModel :: ForbiddenAttributesError. –

2

Изменение маршрутов:

patch "/todos/:id", to: "todos#update", as: "update_todo" 

В форме:

<%= form_for @todo, url: update_todo_path(@todo), method: :patch, do |f| %> 

В контроллере:

def update 
    @todo.update(params.require(:todo).permit(:title, :description)) 
    @todo.save 
end 

Если вы хотите знать все существующие маршруты, вы можете использовать:

$ rake routes 

Он покажет таблицу как

 Prefix Verb URI Pattern      Controller#Action 
     root GET /        posts#index 
    sign_up GET /sign_up(.:format)    users#new 

где префикс будет вам путь URL, как «sign_up» это «sign_up_path» в контроллер/просмотров.