为了清楚起见,我第二次重新阅读railstutorial。我试图了解rails提供的RESTful resources,其中列出了各种HTTP请求以及相应的控制器操作: index,show,new,create,edit,update,destroy。
我从未完全理解rails控制器的工作方式,我想澄清一下。如果我创建users_controller.rb
并想要创建新用户,那么就是。我不关心重定向,flash消息和其他内容。我只想创建新用户并将其保存在我的数据库中。
我想做User.create(name: "Iggy1", email: "letsmail@iggy.com")
。假设我做了迁移,我在数据库模式上有name
(字符串)和email
(字符串)。
创建用户所需的users_controller.rb上最少的代码行是什么?
我之所以提出这个问题的原因是现在,我仍然不能100%确定哪个代码行实际执行了所需的操作。 rails实际上足够聪明,可以识别这些特定关键字index
,new
,create
,destroy
,show
,edit
和{{1 ,或者他们是武断的吗?如果rails足够智能来检测这七个关键字,仅列出方法(update
),是否可以自动访问DELETE用户方法,或者我必须实际说def destroy; #<no code>; end
使用DELETE用户方法?在def destroy; User.find(params[:id]).destroy; end
上,我从railstutorial那里得到了这个精心设计的代码。
users_controller.rb
只是在Users_controller上有...
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
...
足以让rails创建用户吗?
def create
或者我至少需要def create
end
或更多代码才能创建新用户?
答案 0 :(得分:1)
您创建用户所需要做的第一件事就是新的&#39;您的UsersController中的操作,如下所示:
class UsersController < ApplicationController
def new
@user = User.new
end
end
当您声明上述方法定义时,Rails会指望一个名为&#39; new.html.erb&#39;的文件,除非您告诉它渲染另一个模板。
注意:我会继续假设您不想这样做,但如果您这样做,则会在{&#39; new&#的末尾添加render 'other'
39;方法(其他&#39;其他&#39;是文件&#39; other.html.erb&#39;):
由于您的目标是创建新的用户实例,因此该视图模板需要一个表单来添加名称和电子邮件字段。虽然并非所有Rails表单都需要,但创建用户的一种常见方法是创建一个新的&#39; (即未保存的)用户实例并将其传递给表单,以便表单知道用户具有哪些属性。 Rails将此实例变量传递给视图,并且它还知道要呈现的视图文件(因为您定义的&#39; new&#39;方法应该与&#39; new.html.erb&#命名相同的东西39;查看包含表单的模板)。这也是Rails知道“提交”的方式。表单的按钮应显示为“创建用户”。
假设您有上述内容,下一步是在您点击表单后添加一个表格数据的位置&#34; s&#34;提交&#34;按钮。这就是&#39;创造&#39;行动呢。换句话说,&#39; new&#39;动作负责在浏览器中显示表单,并创建&#39;行动负责处理该表格提交的数据。此时您需要添加的最小代码如下:
def create
@user = User.create(user_params)
end
Rails的做法是通过它实现的一种特殊方法,称为&#39; params&#39;。在幕后,Rails接受您提交表单时发生的HTTP请求,并将某些数据存储在ActionController :: Parameters对象中。然后,该数据由&#39; user_params&#39;处理。方法(您需要声明;见下文),并且只返回您在该方法定义中列入白名单的参数(即&#39;名称&#39;和电子邮件&#39;)。
这意味着您需要实施&#39; user_params&#39;方法定义。这通常作为UsersController底部的私有方法完成,因为您不希望在控制器外部使用此方法。因此,您需要添加以下内容:
private
def user_params
params.require(:user).permit(:name, :email)
end
从安全角度来看,这很重要,因为恶意用户可能会在其浏览器中添加新的表单元素(例如,名为&#39; admin&#39;的元素)并点击“提交”。如果您的用户模型确实包含“管理员”。属性,恶意用户刚刚创建了管理员用户(具有相应的管理员权限)。
最后,由于表单发送的请求是POST请求(而不是get请求),因此Rails希望您提供一个视图,以便在用户提交表单后将其发送给用户。此视图通常是“show.html.erb&#39;您刚刚创建的用户的模板,因为&#39;创建&#39;没有自己的模板(请记住,我们讨论的形式是“编辑”动作的视图,而不是“创建动作”的视图)。 &#39;显示&#39;视图通过以下方法呈现:
def show
end
此外,您还需要告诉Rails重定向到&#39; show&#39;在&#39;创建&#39;之后的页面行动结束了。将此添加到“创建”的末尾。方法:
redirect_to @user
由于您传递了User类的单个实例,因此Rails会推断您要重定向到&#39; show&#39;用户控制器的操作(与&#39;索引&#39;或其他一些操作相对)。取决于您传递给&#34; redirect_to&#34;方法,您可以将您的用户发送到任意数量的目的地。有关详细信息,请参阅these docs。
总而言之,除了&#39; edit.html.erb&#39;和&#39; show.html.erb&#39;在&#39; config / routes.rb&#39;中查看模板和路线声明文件(我没有详细讨论,因为问题范围仅限于UsersController),您的UsersController应该具有的最小代码量如下:
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
答案 1 :(得分:1)
您必须了解rails是基于MVC和REST构建的。 MVC是一种分布项目责任的架构模式。
M - Model,它与数据库交互,是实现业务逻辑的理想场所。
V - 查看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_name]
,则rails路由将为控制器中的8个默认操作创建8个URL。举一个例子,让我们说你的控制器是users_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
因此,当您构建视图并将form_for url设置为users_path并将http方法设置为POST时,表单的提交将触发create操作。因此,在创建操作中,您应该编写触发模型以保存记录所需的所有代码。
另外,请仔细阅读本文档,