新手问题 在网站中,创建用户 (sign up) 和更新用户资料 (update) 的时候,rails 是如何沟通数据库的?

cqcn1991 · 2012年10月11日 · 最后由 nightire 回复于 2012年10月12日 · 3801 次阅读

新手,正在看 ruby on rails tutorial 有一点十分不明白

无论是 sign up 还是 update 用户,都是需要同数据库交流的 也就是需要 post,put 这些 request 的 但是这个东西,在我们写的代码的叙述当中似乎并没体现?

比如 在 user_controller 中的 create 和 update(即创建新用户和更新用户资料两个 action 里),仅有定义@uers,剩下来就是判断是否保存了@user。并没有一个语句告诉服务器“我要保存这个用户”,“我要更新这个用户” def create @user =User.new(params[:user]) if @user.save else end end

def update @user = User.find(params[:id]) if @user.update_attributes(params[:user]) else end end

是不是在routes.rb中,定义 user 为 resources 的时候,已经自动完成了这个功能? 就是体现在 url 中。比如 user/new,就已经定义好了,在访问这个页面的时候,会发生 post 这个 request(在按 button 的时候即会发出),进而保存这个用户?

@user.save就是保存当前用户啊,@update_attributes就是更新当前用户。

#1 楼 @ikbear 原来如此! 就是说,if 会直接执行这个语句。也就是说 if 这个语句的用法,实际上不仅仅只是判断功能,而是实际上起到了,执行 + 判断的功能? 对于这个过程,可以理解为这样么: @user.save if success else

#2 楼 @cqcn1991 这个不是 if 语句的功能,@user.save 这个语句返回的是 true 或者 false,这个 true 或者 false 可以是一个变量值,也可以是任意表达式的值,只要它最终的结果符合条件就行。

#3 楼 @ikbear 我换个问法吧…… 我们在注册用户的时候,需要告诉服务器“我要保存这个用户”,这个语句我们是如何实现的?如何通过按下“提交”按钮触发的?也就是@user.save这个语句的执行在哪里?(因为如你所说,if 只是判断并没有执行啊)

#4 楼 @cqcn1991 用户按下按钮的时候,浏览器通过 http 协议将数据以及相应的 http 方法发送给服务器。服务器端根据路由表处理用户的请求,比如 routes.rb 里定义的 match '/signup', to: "users#new",就表示服务器将来自/signup 的请求交给 users 控制器下的 new 这个 action 处理。相应的,resources :users定义了/users/new交给users#new这样的方法处理,你在终端下敲入"rake routes"命令就能看到。

看看 form_for 的文档吧

#4 楼 @cqcn1991 其实是这样的,当你提交表单时,路由信息会把任务交给 user_controller 中的 create 方法去处理。 user_controller 会与数据库进行处理,当然不是底层的处理方式,是利用了 ORM 进行了抽象,User 类就是 users 表,User.new 就是说,数据库新建一条记录。user_controller 中有这么一行代码 @user =User.new(params[:user]) 代码中 params[:user] 就是表单中传过来的数据,这是一个 hash,如 :user => {:username => "liming", :password => "123456"} @user =User.new(params[:user]) 这条代码会去创建一个新的数据库记录,但还不会保存。 只有在执行 @user .save 时,rails 才会发送 insert into users(username,password) values('liming','123456') 这条数据库插入命令 @user.save 返回的是一个布尔值 if 判断只是在确定数据库新记录插入成功时会去做什么,比如 redirect_to 重定向至另一个页面,或者其他命令 当你更新一条记录时,User.find(params[:id]) 会去查找这条记录,@user.update_attributes(params[:user]) 中 update_attributes 方法会去更新传过来的数据,然后利用 if 判断语句去判断 记录成功后应该做哪些事情,比如告诉用户更新成功,上面的创建也是一样。 哪里不明白,再指出来。

#7 楼 感谢 LS 各位的回答!查了 resources 的说明 @tiseheaini 是不是这样?rails 可以自动判断出是用 Post 还是用 put 方法?然后路由(根据 resources 的默认路径)也就可以以此指向 controller 中的 create 动作。 但是,@user.save这个命令依然不知道在哪里执行了啊?(if 只是判断而已) def create @user =User.new(params[:user]) if @user.save else end end 并没有一条明确的指出了,“我要保存这个用户”额。就是这个问题了

#8 楼 @cqcn1991 这个问题不好解释, @user.save 运行后会返回 true 或者 false

def create
  @user =User.new(params[:user])
  @user.insert(假设插入命令为 insert)
    if @user.insert(假设插入命令为 insert)
      ~~~
    end
end

假设插入命令为 insert,不为 save。那么 ruby 解析器会运行两次 @user.insert ,数据库中也会插入两条记录。 解析器是这样运行的 if 然后去运行 @user.save ,运行成功就会插入一条记录。运行完后告诉 if 运行结果为真。后面的语句会继续运行 if 后面的语句。为假就会运行 else 后面的语句。 这么解释能明白吗?? 路由分为 get post put delete 四种,get 对应 index show new edit,post 对应 create,put 对应 update,delete 对应 destroy。这是约定好的。当然也修改和添加新的规则。 建议你看看 敏捷开发第三版中文,英文好的话,直接看第四版英文,书上讲的比我详细。

#9 楼 @tiseheaini OK! 完全弄明白了 谢谢啦!

#10 楼 @cqcn1991 我觉得你的问题是没有理解 RESTful,建议读一下相关资料。

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