新手问题 关于 form_for,新手绊门槛上了……

akawa · 2013年02月01日 · 最后由 join 回复于 2013年09月25日 · 4438 次阅读

ROR 新手,以前是做前端的 久仰 rais 大名于是决定自学 跟着 Ruby on Rails Tutorial 过了一遍 rails 后决定自己动手试试 index,show 等 GET 页面都没事 结果到 new 这个 POST 页面就被卡住了,已经卡了一天了有没有…… 看不明白为啥总说我路径错误,如果我用脚手架生产一套 controller 和 model 的话,把生成的数据表名换到这里倒是可用 不过这也不是解决办法……

求老鸟,大牛带一程……谢了

NoMethodError in User#new

Showing /home/vilppu/projects/demo/app/views/user/new.html.erb where line #1 raised:

undefined method `users_path' for #<#<Class:0xb2f3b468>:0xb3013e80>

routes.rb

root to: "user#index"
resources :user

new.html.erb

<%= form_for(@user) do |f| %>
    <%= f.label :name %>
    <%= f.text_field :name %>

    <%= f.label :age %>
    <%= f.text_field :age %>

    <%= f.submit 'submit' %>
<% end %>

user_controller.rb

class UserController < ApplicationController
  def index
    @users = User.all
  end

  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
  end

end

root to: "user#index" 似乎应该是 root to: "users#index" resources :user 显然也应该是 resources :users

controller 恐怕要用复数,users_controller.rb, 文件里面也改成 UsersController

没有按约定,controller 应该是双数的 UsersController。

方案一,遵循约定

UserController 改 UsersController,文件名也改成 users_controller.rb

路由改

root to: "users#index"
resources :users

方案二,用你的单数命名

表单改

<%= form_for(@user), :url => user_index_path do |f| %>

因为不按约定,所以每个 form 都要指定 :url 参数,而且我不太确定以单数命名的复数资源的路由 helper 是怎么命名,可以 rake routes 确定一下。

resources :user 应该是 :users 前者不符合 convention

你用 scaffold 生成后对比就可以发现了 要多多用 diff 工具哦~~~ 靠人眼看是不行的哦~~~

#4 楼 @iBachue 啥是 diff....?difference 的工具?

#5 楼 @cqcn1991 是的 作为 Ruby 程序员 diff 除了表示 Unix 中用于对比文件之间差异以外没有任何其他含义的

非常感谢楼上各位大大的指点,经测试,这个问题已经 OK 了,总结了一下:

方法一:修改routes.rb内的user改为users,controller 也改为Users_controller.rb,controller 类名改为class UsersController < ApplicationController,View 文件夹改为users后可通过

方法二:改表单为:<%= form_for @user, :url => user_index_path do |f| %> 注意@user是没有括号的 或者<%= form_for(@user), :url => { :action => 'create' } do |f| %>亦可通过

方法二不推荐,还是以遵循约定为上

@blacktulip @Rei @iBachue 再次感谢!

谢谢,碰到了同样的命名问题,google 到这里解决了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号