新手问题 在创建项目的过程中 写 create update 的时候 老是会报 未定义的方法这样的错误 很奇怪的问题 目前还没找到答案所以请问一下大神

babyhai · 2017年04月05日 · 最后由 babyhai 回复于 2017年04月06日 · 1425 次阅读
ruby版本号: 2.3
rails版本号  5.0.2

这是我写的 controller

class BooksController < ApplicationController
  def index
    @books = Book.all
  end

  def new
    @book = Book.new
  end

  def create
    Book.create :title => params[:book][:title],
        :author => params[:book][:author]

    redirect_to books_path
  end

  def edit
    @book = Book.find params[:id]
  end

  def update
    @Book.update params[:book]
    redirect_to books_path
  end
end

这是编辑页

<h2>编辑书籍</h2>

<%= form_for @book do |f| %>
  书名: <%= f.text_field :title %><br/>
  作者: <%= f.text_field :author %><br/>
 <%=f.submit %>
<% end %>

这是首页

<h2>首页</h2>

<table>
  <tr>
    <td>书名</td>
    <td>作者</td>
    <td>操作</td>
  </tr>
<% @books.each do |book| %>
  <tr>
    <td><%= link_to book.title, book %></td>
    <td><%= book.author %></td>
    <td>
      <%= link_to '编辑' , edit_book_path(:id => book.id) %>
      <%= link_to '删除', book, :mothod => :delete %>
    </td>
  </tr>
<% end %>


<%= link_to '新建', new_book_path %>

这是 new 页面

<h2>新建图书</h2>

<%= form_for @book do |f| %>
   书名:<%= f.text_field :title %><br/>
   作者:<%= f.text_field :author %><br/>
   <%= f.submit %>
<% end %>

服务器用的是 rails 内置的服务器

首先我把我遇到的几个问题讲出来 第一个问题 是 new 页面的问题 在我只写了

class BooksController < ApplicationController
  def index
    @books = Book.all
  end

  def new

  end

end

new 并没有写 @book = Book.new
在首页 点击新建后 提示我

然后再 new 里面加了 @book = Book.new 就没有这个报错了 这是第一个问题

第二个问题就是 create 我不清楚是否是我写的有问题 还是别的地方操作有误 才导致这个问题的 刚开始 create 写的是这样的

def create
    @book.create :title => params[:book][:title],
        :author => params[:book][:author]
end

这么写 报错提示: 然后改成 Book.create :title => params[:book][:title], :author => params[:book][:author] 又没有报错了,但是 在此之前我反复遇到过这个问题 第一次写的是 Book.create :title => params[:book][:title], :author => params[:book][:author] 它报错了 然后又改成 @book.create 又没有报错了 现在又成这样 让我很困惑

还有第三个问题 是 update

def update
   @Book.update params[:book]
   redirect_to books_path
 end

之前也是这么写 并没有报错 然而再今天又报错了 上面说的 create update 就是有时候 create 报错了 有可能 update 并没有报错 有时候 两个都会报错 然后我以为是我基础的没学好 把 guides 的 controller 都看完了 也没能明白 造成这些错误的原因是什么 然而我问过跟我一起学习的小伙伴 他们并没有遇到这样的错误 我们的写法都是一样的 但是我这边还是会有这个错误 我的是 centos 他们用的是 mac 的系统 希望有大神能帮我解答一下疑惑

你这三个问题,都是 @book 没有定义呀。。。。。。。。。

可能你之前写的有个 私有方法设置了 变量,然后 before_action 调用了那个方法设置了变量

并不是大神。new页面里不妨写成这样:

<h2>新建图书</h2>

<%= form_for :book do |f| %>
   书名:<%= f.text_field :title %><br/>
   作者:<%= f.text_field :author %><br/>
   <%= f.submit %>
<% end %>

rails里的错误原因表明了这@book没有定义.. 其余的edit等也可以照这改

然后,其实new动作可以直接这样写就好了:

def new

end
MaiZardAyumi 回复

@book 没有定义 啥意思 能说清楚点么

msl12 回复

是这样的 我学习 form 表单对象的时候 老师说了 写 form_for 一定要写成 <% = form_for @book do |f| %> 说没有 3-5 经验不要写成 :book 不要有奇葩的 action 然后我想问问 @book 跟 :book 有啥区别

MaiZardAyumi 回复

这个@book 要怎么定义 ruby 基础的我都学过 就是这里的@book 是数据表有个叫 books 这里的@book 不大清楚指的是什么

@book = Book.create 这么定义??

babyhai 回复
@book = Book.new(book_params) 
if @book.save
  #dosomething
else
  # dosomething
end

这和

Book.create(book_params)

是等价的 感觉你有很多基础知识都不清楚呀,看看 Michael Hartl 的《Ruby on Rails Tutorial》吧

好的 谢谢 就是 像你之前这么写过 但是还是会报未定义的方法 这里把我绕糊涂了

babyhai 回复

不用谢~ 都是新手,一起学习,Book 是类, @book 是 Book 的实例变量, 实例变量直接在视图可用, 所以你在 new 方法里面要有@book 才能在 new 视图里面使用 : )

嗯呢 那你上面说的 @book 没有定义 才造成这三个问题的? 要怎么定义 Book 是 model 层的那个么

babyhai 回复

额,你可以加我 QQ 491369052 , 晚上回去再和你说说,。。这是面向的对象的基础知识了。

MaiZardAyumi 回复

已经加了,我快下班了 你需要加班么

def new
  @book = Book.new
end

🙃我就是那个一起学习的小伙伴~

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