给定DBIx :: Class结果集,例如:
my $rs = $c->model("DB::Card")->search({family_name => "Smith"});
Run Code Online (Sandbox Code Playgroud)
我读过的教程使用stash传递一行arrayref:
$c->stash->{cards} = [$rs->all];
Run Code Online (Sandbox Code Playgroud)
这导致查询在此时执行,并且生成的对象填充到存储中,因此它们可以在TemplateToolkit中用作:
[% FOREACH card IN cards %]
[% card.given_name %] [% card.family_name %]
[%END%]
Run Code Online (Sandbox Code Playgroud)
有没有一种正确的方法让TT在从数据库中获取时对行进行迭代?
在Perl链接方法中处理异常的最佳方法是什么?如果链接的任何方法抛出异常,我想分配值0或undef
代码示例:
my $x = $obj->get_obj->get_other_obj->get_another_obj->do_something;
Run Code Online (Sandbox Code Playgroud)
最好的办法是什么?我每次都必须在try/catch/finally语句中包装吗?我想要应用的上下文是:我正在使用Catalyst和DBIC进行Web开发,我做了很多链式结果集,如果这个结果集中的一些抛出异常,我只想分配0或undef的值,然后对待它模板中的错误(我使用Template Toolkit).如果还有另一种方法可以做到这一点而不包含try/catch中的每个调用,请告诉我.如果您知道在相同的上下文(Catalyst/DBIC/TT)中处理此类错误的更好方法,请建议.一个实际的例子是当用户搜索某些内容时,这不存在.
我通常可以通过随机尝试这两种选项的不同排列来获得我想要的行为,但我仍然不能说我确切地知道他们做了什么.是否有一个具体的例子来证明这种差异?
将Catalyst应用程序部署到生产服务器的好方法是什么?目前我只是在存储库的根目录中有一个FastCGI调度脚本,当我想更新服务器代码时,我将分支推送到服务器.这很简单,但并不完美.如果代码在服务器计算机上的测试失败(例如由于不满意的依赖关系),我将留下破坏的应用程序.如何部署Catalyst应用程序?你有更好的方法吗?
对于任何给定的结果类MySchema :: Result :: Foo(从默认模式加载器生成的语法构建,使用Moose/MooseX :: nonmoose)
如果我添加一个BUILDARGS方法包装来清理行的构造函数数据,如下所示:
package MySchema::Result::Foo;
use Moose;
use MooseX::NonMoose;
[etc ..]
around 'BUILDARGS' => sub {
my $orig = shift;
my $class = shift;
delete $_[0]->{not_a_real_column};
return $class->$orig(@_);
};
Run Code Online (Sandbox Code Playgroud)
它直接使用架构时有效.例如,以下按预期工作:创建一个新的行对象,使用real_column =>'value'并删除not_a_real_column - > new
use MySchema;
my $s = MySchema->connect('dbi:blahblahblah');
$s->resultset('Foo')->new({ real_column=>'value', not_a_real_column=>'some other thing' }); #win
Run Code Online (Sandbox Code Playgroud)
但是,当通过Catalyst :: Model :: DBIC :: Schema使用相同的模式时,顺序是不同的.尝试创建新的Foo行对象时,以下操作失败,因为not_a_real_column无效.换句话说,在调用new之前,new的参数不会通过BUILDARGS运行.
$c->model('MySchemaModel')->resultset('Foo')->new({ real_column=>'value', not_a_real_column=>'some other thing' }); #fails
Run Code Online (Sandbox Code Playgroud)
有趣的是,如果我绕过'new'=> sub {}而不是'BUILDARGS'=> sub {},两种情况下的行为是相同的,并且工作正常,但据我所知,Moose教条声明永远不会弄乱新.
任何人都在关心帮助我理解为什么会这样,或者是否有更好的方法?
我目前正试图将我的一个较小的催化剂应用程序移植到Mojolicious(只是为了它的乐趣).
假设我们在页面上:http://whatever.com/generate.在该页面上有一个链接,例如"生成"
使用催化剂(使用TT模板)并将链接定义为
uri_for 'generated'
Run Code Online (Sandbox Code Playgroud)
它将生成一个指向http://whatever.com/generate/generated的链接 但是如果你将其定义为
uri_for '/generated'
Run Code Online (Sandbox Code Playgroud)
它将生成一个指向http://whatever.com/generated的链接
我尝试用Mojolicious'url_for做同样的事情,但似乎工作方式不同.我打电话的时候并没有什么不同
url_for 'generated'
Run Code Online (Sandbox Code Playgroud)
要么
url_for '/generated'
Run Code Online (Sandbox Code Playgroud)
两个调用都生成一个'/ generate/generated'的链接
所以我的问题是:如何让url_for生成绝对路径的链接.即'/ generated'
谢谢,Gr,ldx
我有一些看起来像这样的代码:
use SomeApp;
use Test::WWW::Mechanize::PSGI;
my $mech = Test::WWW::Mechanize::PSGI->new(
app => sub { SomeApp->run(@_) },
);
$mech->get_ok('/');
Run Code Online (Sandbox Code Playgroud)
但是,一旦get_ok()
调用,我收到以下警告:
PSGI error: failed to listen to port 8080: Address already in use at .../5.18.1/HTTP/Server/PSGI.pm line 94.
HTTP::Server::PSGI::setup_listener('HTTP::Server::PSGI=HASH(0x7fe6622fad60)') called at .../5.18.1/HTTP/Server/PSGI.pm line 54
Run Code Online (Sandbox Code Playgroud)
是的,我正在使用那个端口做其他事情.来自Test :: WWW :: Mechanize :: PSGI的文档:
此模块允许您测试PSGI Web应用程序,但不需要服务器或发出HTTP请求.相反,它将HTTP请求对象直接传递给PSGI.
所以从理论上讲,我不需要指定一个端口,但是我得到了上面的警告,并且获取的页面返回了500(它们在浏览器中工作正常).我错过了什么?
更改MyApp->run
为MyApp->psgi_app
结果:
Can't call method "request" on an undefined value at .../5.18.1/Test/WWW/Mechanize/PSGI.pm line 47.
Run Code Online (Sandbox Code Playgroud)
可以使用以下命令复制此错误: …
我的目标是旋转uWSGI生成的日志,但是当原始日志文件被删除(压缩后)时,它不会再次重新创建.
所以我认为应用程序需要在删除文件后正常重启主进程.我使用这个RESTART脚本:
/home/tester/uwsgi-18
--reload /var/run/uwsgi/my_app_tester/my_app_tester.pid
Run Code Online (Sandbox Code Playgroud)
应用程序重新启动,但日志没有.
为了再次进行日志记录工作,我需要终止-2进程并再次运行START脚本,以便生成另一个进程号并再次进行日志记录.
显然我不希望这种硬停止只是为了旋转日志......
我的应用程序是使用Catalyst构建的,服务器运行Nginx,这里是uWSGI START脚本:
/home/tester/uwsgi-18
--master
--daemonize /var/log/uwsgi/my_app_tester/log
--socket /tmp/uwsgi/my_app_tester/my_app_tester.socket
--processes 1
--psgi /home/tester/my_app/my_app.psgi
--pidfile /var/run/uwsgi/my_app_tester/my_app_tester.pid
--procname-master TESTER
-L
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以重新启动应用程序而不会丢失连接和日志记录?
提前谢谢:Migue
如何构建一个包含构建 Mac Catalyst 应用程序所需架构的胖框架?
他在那里,我正在尝试在 Mac Catalyst 13.0+ 中打开(启动)一个 Finder。并且“ NSWorkspace ”在 Mac Catalyst 中不可用
我的代码:
func openFinder(url: URL?){
guard let url = url else { return }
NSWorkspace.shared.activateFileViewerSelecting([url])
}
Run Code Online (Sandbox Code Playgroud)
错误:
“NSWorkspace”在 Mac Catalyst 中不可用
你知道我如何在 Mac Catalyst 中做到这一点吗?
catalyst ×10
perl ×7
dbix-class ×3
mac-catalyst ×2
frameworks ×1
ios ×1
macos ×1
mojolicious ×1
moose ×1
nginx ×1
plack ×1
psgi ×1
swift ×1
uwsgi ×1
xcode11 ×1