我想更新现有标题和说明。我的项目称为todo,数据库是todos(因为我使用generate commant生成)。 我的代码是 edit.html.erb:
<%= 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
我的问题是:我来自带有ID的索引页面,编辑功能显示我想要的项目,然后我想更新标题和描述字段并点击f.submit按钮进行更新。我的问题是参数没有来,我得到todos.2(我猜它的大小:会话哈希?)。 我没有使用&lt;%= button_to%&gt;因为我看到所有教程都不需要它。 我的问题是我的错误在哪里,参数为什么不来?
答案 0 :(得分: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
其中prefix是你的路径网址,如'sign_up',它是控制器/视图中的“sign_up_path”。
答案 1 :(得分: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
但是,我建议您坚持使用约定,而不是为此目的编写和定义自己的命名路由。