我发现很难直观地看到类在rails中做了什么,而且我不完全理解视图是如何呈现的。
这是我正在查看的代码示例(它是创建一个简单的用户登录)。
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
redirect_to(root_url, {notice: "Congratulations on signing up"})
else
render "new"
end
end
def user_params
params.require(:user).permit(:email, :password)
end
end
请指出我对此概念化方式的任何不准确之处:
在根网址中输入地址栏:
向Web服务器发送get请求到根目录,服务器查找root,看root '/users#new'
。
server创建UsersController类的实例,并在该实例上调用“new”方法。
此方法创建User类的实例,并将其存储为UsersController实例的实例变量。的不知何故?这会导致呈现users / new.html.erb页面,这是一个表单。
您已填写表单并在提交时回复到服务器(使用帖子)。
这会自动定向到用户#create动作,并使用存储在params散列中的变量运行该位代码。
UsersController的实例与它的模型实例一起被丢弃,但是params散列一直存在,直到它被覆盖?
这是对的吗?
视图是如何呈现的?
和另一个稍微偏离主题的问题。 post和get变量都存储在params哈希中吗?
答案 0 :(得分:1)
好吧,你不应该把所有东西想象成实例化为对象的类。
让我们想一下没有Web服务器,只有应用服务器(Webrick或其他)的场景。
在您的方案中,一般情况:
在浏览器栏上写一个URL,将向服务器发起'GET'请求。
您的服务器将把捕获的请求及其所有数据提供给控制器中的操作,具体取决于与一组称为路由的可能替代方案的匹配。路线,你可以想象正则表达式附加一些选项。
然后,您的数据(在这种情况下为GET
)将传递给适当的控制器操作。在那里,根据逻辑,一些对象(这里来了)可以从类中实例化(如来自@user
的{{1}})
在操作中,将有一个指令告诉rails要呈现的内容或将遵循默认指令(默认指令:呈现与操作具有相同名称的视图,并且位于名称与控制器的名称匹配的文件夹中name - 所有这些都是可配置的。)
呈现视图时,ruby会将模板转换为HTML或其他格式(取决于控制器操作要求)。渲染的输出通过接收请求的同一应用程序服务器发送到浏览器,从而创建“User
”。
答案 1 :(得分:0)
您可以查看您的服务器日志,以确切了解在rails接触它们之前传递了什么参数,并且没有params散列不包含已经在http标头中使用的HTTP方法,不需要将它们放在params中也是哈希。
至于为什么render new
在填写状态下显示表单。那是因为您在create中设置了变量并渲染了新模板。你只是渲染新模板而新模板并不关心你来自哪个动作只是想看看你有什么变量,并用匹配的Ivariables东西填写模板。你在create中设置了@variable,你在new.html.erb中调用了@variable,所以它显示了它。
有道理还是应该改写?