Ruby on rails Rails RESTful控制器创建用户的操作
为了清楚起见,我第二次重读。我试图理解rails提供的内容,其中列出了各种HTTP请求以及相应的控制器操作:索引、显示、新建、创建、编辑、更新和销毁 我从未真正完全理解rails控制器是如何工作的,我想澄清一下。如果我创建了一个Ruby on rails Rails RESTful控制器创建用户的操作,ruby-on-rails,rest,controller,railstutorial.org,Ruby On Rails,Rest,Controller,Railstutorial.org,为了清楚起见,我第二次重读。我试图理解rails提供的内容,其中列出了各种HTTP请求以及相应的控制器操作:索引、显示、新建、创建、编辑、更新和销毁 我从未真正完全理解rails控制器是如何工作的,我想澄清一下。如果我创建了一个users\u controller.rb并想创建一个新用户,就是这样。我不在乎重定向、即时消息和其他天赋。我只想创建新用户并将其保存在我的数据库中 我想做User.create(名称:“Iggy1”,电子邮件:letsmail@iggy.com)。假设我进行了迁移,并且
users\u controller.rb
并想创建一个新用户,就是这样。我不在乎重定向、即时消息和其他天赋。我只想创建新用户并将其保存在我的数据库中
我想做User.create(名称:“Iggy1”,电子邮件:letsmail@iggy.com)
。假设我进行了迁移,并且在DB模式上有名称
(字符串)和电子邮件
(字符串)
创建用户所需的users\u controller.rb上的最小代码行是多少?
我问这个问题的原因是直到现在,我仍然不能100%确定哪个代码行实际执行了所需的操作。rails是否真的足够聪明,能够识别这些特定的关键字索引
,新建
,创建
,销毁
,显示
,编辑
,以及更新
,或者它们是任意的?如果rails足够聪明,只需列出方法(def destroy;#end
),就可以检测到这七个关键字,那么DELETE user方法是否可以自动访问,或者我不得不说def destroy;User.find(params[:id]).destroy;结束
是否使用删除用户方法?在users\u controller.rb
上,我最终从railstutorial获得了这段详细的代码
...
def create
@user = User.new(user_params)
if @user.save
@user.send_activation_email
flash[:info] = "Please check your email to activate your account."
redirect_to root_url
else
render 'new'
end
end
...
仅仅在用户控制器上有def create
就足以让rails创建用户吗
def create
end
或者我至少需要有
User.new
,或者更多代码来创建新用户?创建用户首先需要在UsersController中执行“新建”操作,如下所示:
class UsersController < ApplicationController
def new
@user = User.new
end
end
def create
@user = User.create(user_params)
end
private
def user_params
params.require(:user).permit(:name, :email)
end
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.create(user_params)
redirect_to @user
end
def show
end
private
def user_params
params.require(:user).permit(:name, :email)
end
end
Rails实现这一点的方式是通过它实现的一个特殊方法,称为“params”。在幕后,Rails接受提交表单时发生的HTTP请求,并将某些数据存储在ActionController::Parameters对象中。然后,该数据由“user_params”方法(您需要声明该方法;请参见下文)处理,并且仅返回您在该方法定义中白名单上的参数(即“name”和“email”)
这意味着您需要实现“user_params”方法定义。这通常作为UsersController底部的私有方法完成,因为您不希望该方法在控制器外部可用。因此,您需要添加以下内容:
class UsersController < ApplicationController
def new
@user = User.new
end
end
def create
@user = User.create(user_params)
end
private
def user_params
params.require(:user).permit(:name, :email)
end
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.create(user_params)
redirect_to @user
end
def show
end
private
def user_params
params.require(:user).permit(:name, :email)
end
end
从安全角度来看,这一点很重要,因为恶意用户可能会在其浏览器中添加新的表单元素(例如,名为“admin”的元素)并单击“提交”。如果您的用户模型确实包含“admin”属性,则该恶意用户刚刚创建了一个管理员用户(具有相应的管理员权限)
最后,由于表单发送的请求是POST请求(不是get请求),Rails希望您提供一个视图,以便在用户提交表单后将其发送给用户。此视图通常是您刚刚创建的用户的“show.html.erb”模板,因为“create”没有自己的模板(请记住,我们讨论的表单是“edit”操作的视图,而不是“create”操作的视图)。“显示”视图通过以下方法呈现:
def show
end
此外,在“创建”操作完成后,您需要告诉Rails重定向到“显示”页面。将此添加到“创建”方法的末尾:
redirect_to @user
由于您传递了User类的单个实例,Rails推断您希望重定向到用户控制器的“show”操作(而不是“index”或其他操作)。根据传递给“redirect_to”方法的内容,您可以将用户发送到任意数量的目的地。有关更多信息,请参阅
总之,除了“edit.html.erb”和“show.html.erb”视图模板以及“config/routes.rb”文件中的路由声明(我没有详细讨论,因为问题范围仅限于UsersController),UsersController应该具有的最低代码量如下:
class UsersController < ApplicationController
def new
@user = User.new
end
end
def create
@user = User.create(user_params)
end
private
def user_params
params.require(:user).permit(:name, :email)
end
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.create(user_params)
redirect_to @user
end
def show
end
private
def user_params
params.require(:user).permit(:name, :email)
end
end
class UsersController
您必须了解rails是基于MVC和REST构建的。MVC是一种架构模式,用于分配项目的责任
M模型,它与数据库交互,是实现业务逻辑的理想场所
V-View,在这里进行HTML呈现
C-控制器,基本上连接M和V之间的通信
因此,基本上,当最终用户访问您的域时,请求会到达Web服务器,然后到达rails API。rails API将知道传输请求的默认控制器,默认控制器操作将返回html输出
config/routes.rb中的默认路由器
root to: 'controller#action'
同样,rails理解5种HTML方法,即GET、POST、PUT、DELETE和PATCH。因此,一旦您创建了一个控制器并将routes.rb中的引用设置为resources[controller\u name]
,rails路由将为控制器中的8个默认操作中的每一个创建8个URL。例如,假设您的控制器是users\u controller.rb,然后在routes.rb中将其设置为resources:users
,这将允许以下方法
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
因此,当您构建视图并将url的表单_设置为users_path并将http方法设置为POST时,表单的提交将触发创建操作。因此,在create操作中,您应该编写触发模型所需的所有代码