Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails RESTful控制器创建用户的操作_Ruby On Rails_Rest_Controller_Railstutorial.org - Fatal编程技术网

Ruby on rails Rails RESTful控制器创建用户的操作

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)。假设我进行了迁移,并且

为了清楚起见,我第二次重读。我试图理解rails提供的内容,其中列出了各种HTTP请求以及相应的控制器操作:索引、显示、新建、创建、编辑、更新和销毁

我从未真正完全理解rails控制器是如何工作的,我想澄清一下。如果我创建了一个
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操作中,您应该编写触发模型所需的所有代码