面试题答案
一键面试- 接收前端表单数据
- 在Rails中,前端表单数据通常在控制器的相应动作中接收。假设我们有一个名为
users
的控制器,以及一个处理用户注册的create
动作。 - 对于一个简单的文本字段,比如用户名
username
,在前端表单中有类似<input type="text" name="user[username]">
这样的输入。在控制器中可以通过params
哈希来接收,例如:
def create @user = User.new(params[:user]) end
- 复选框:如果有一个表示用户是否同意条款的复选框,前端可能是
<input type="checkbox" name="user[agree_to_terms]">
。在Rails中,当复选框被选中时,params[:user][:agree_to_terms]
会是"1"
或"true"
(取决于浏览器),未选中时不会出现在params
哈希中。可以在控制器中进行如下处理:
def create params[:user][:agree_to_terms] = true if params[:user].key?(:agree_to_terms) @user = User.new(params[:user]) end
- 单选按钮:假设是性别选择的单选按钮,前端可能是
<input type="radio" name="user[gender]" value="male">Male
和<input type="radio" name="user[gender]" value="female">Female
。在控制器中同样通过params[:user][:gender]
来接收选中的值。
- 在Rails中,前端表单数据通常在控制器的相应动作中接收。假设我们有一个名为
- 数据验证
- 模型层验证:在Rails中,数据验证主要在模型层进行。例如,对于
User
模型,如果username
字段是必填的,可以在app/models/user.rb
中这样定义:
class User < ApplicationRecord validates :username, presence: true end
- 对于复选框的
agree_to_terms
字段,可以添加验证确保用户必须同意条款:
class User < ApplicationRecord validates :agree_to_terms, acceptance: true end
- 控制器层验证:虽然主要验证在模型层,但有时也需要在控制器层做一些额外验证。例如,在
create
动作中,可以这样处理验证结果:
def create @user = User.new(params[:user]) if @user.valid? @user.save redirect_to @user else render :new end end
- 模型层验证:在Rails中,数据验证主要在模型层进行。例如,对于
- 数据Sanitize操作
- Action View的
sanitize
方法:如果在视图中直接输出用户输入的数据,为防止跨站脚本攻击(XSS),可以使用sanitize
方法。例如,假设@user
有一个bio
字段,在视图中输出:
<%= sanitize @user.bio %>
- Active Record的保护机制:Rails的Active Record有
attr_accessible
(在较旧版本)或strong_parameters
(较新版本)来防止大规模赋值攻击。在控制器中,使用strong_parameters
,例如:
这样可以确保只有允许的参数被用于创建或更新模型实例,防止恶意用户传递额外的有害参数。def create @user = User.new(user_params) #... end private def user_params params.require(:user).permit(:username, :agree_to_terms, :gender) end
- Action View的