Rails RESTful控制器操作以创建用户

时间:2016-07-23 18:21:10

标签: ruby-on-rails rest controller railstutorial.org

为了清楚起见,我第二次重新阅读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实际上足够聪明,可以识别这些特定关键字indexnewcreatedestroyshowedit和{{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 或更多代码才能创建新用户?

2 个答案:

答案 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操作。因此,在创建操作中,您应该编写触发模型以保存记录所需的所有代码。

另外,请仔细阅读本文档,

http://guides.rubyonrails.org/routing.html