Ruby on Rails路径理解

时间:2014-12-01 10:54:14

标签: ruby-on-rails ruby

我想更新现有标题和说明。我的项目称为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;因为我看到所有教程都不需要它。    我的问题是我的错误在哪里,参数为什么不来?

2 个答案:

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

但是,我建议您坚持使用约定,而不是为此目的编写和定义自己的命名路由。