在这一章,作者从设置路由,设置动作开始,然后完善界面,进而创建了用户界面和用户注册界面两个界面.
其中用到了一些 Rails 开发的核心的知识.
第一个界面:用户界面——show.erb.html
为了显示用户界面,首先应该有一个针对特定用户的路由,这个路由有具体的动作(最好能返回这个用户的信息),然后找到对应的视图(show.erb.html), 进而渲染界面.
路由规则 & resource :users
路由规则:以 id 为1的用户为例,其 url 为 /urer/1,发送的请求类型为 GET.
因此,应该在路由文件中添加对应的路由,
由于 User 是一模型,因此只要可以通过在 config/routes.rb 中添加 resource :users 这行代码,就可以实现添加对应的路由了.
resource :users 还有其他作用:
- 使 users/1 等一系列路由可以访问
- 为 User 资源提供、并与路由关联了所有动作,即 index, show, new, create, edit, update, destroy
动作规则 & @user
动作规则:显示用户界面的动作为 User 控制器的 show 动作.
在 def show 动作中可以添加代码 @user = User.find(params[:id]) 来返回当前用户.
视图:
返回当前用户之后, 因为 @user 可以在所有视图中使用,因此可以在 app/views/show.html.erb 中利用 @user 的一系列属性,使用 Erb 来返回相应的值.
第二个界面:注册界面——new.html.erb
路由规则:由第一个界面中路由的配置,已经为注册界面配置了路由和相应的动作,即 /signup 和 new 动作.
动作规则;由于是注册用户,所以应该在 def new 动作中添加代码 @user = User.new,实现创建用户.
接下来应该让用户在视图中输入相关的信息,然后这些信息交给模型,使其保存在数据库中,实现这一功能的是 Rails 内置功能 form_for
视图中的form_for
格式:
<%= form_for(@user) do |f| %>
...
<%= f.label :password %>
<%= f.password_filed :password %>
...
<% end %>
从外往里看:
- form_for 使得生成的字段元素可以用于设定 @user 对象的属性.
- f.label 用于设定对象属性的(名义上的)名称
- f.password_field用于产生 HTML 代码 input
<id="user_password" name="user[password] type="password" />
其中, id 用于 CSS, type 用于适应客户的设备的特征, name 则被 Rails 当作键,用户在其中的输入当作值,所有键值对用于构建一个名为 params 的散列,用于创建用户. 是真正发挥作用的地方.
失败界面——render 'new'
为了能够处理失败情况(用户输入的值无效的情况),则应该在 def new 中添加 if 分支语句, 如果失败,则重新渲染界面,即添加 else render 'new' 语句.
一旦用户输入无效的情况, form_for 将无效数据传递给模型之后,模型会产生 errors.full_messages 这一个数组,其中包含了出错的所有原因的字符串.
为了出现出错的信息, 应该使用 Rails 的内置方法 @user.errors.full_messages 进行逐条输出.
成功界面——redirect_to @user
在 if 分支中,如果用户注册成功, 即 @user.save 返回值为 true, 那么应该执行 redirect_to user_url(@user),其可以简写成 redirect_to @user(Rails 会自动判断为 user_url(@user))