我目前正在开发基于 Laravel 4 框架的 cms。我正在尝试构建一个类似于 Pyro CMS 的插件系统,其中可以使用 Blade 模板系统将模块 View 包含在页面 View 中。
我正在构建一个联系表单插件,如果提交成功,它将把用户重定向到给定的 url,或者简单地重定向回现有页面。
我的联系表单类的代码是:
class Contact {
public static function form($params)
{
//get params and execute relevant logic here
$redirect = isset($params['redirect']) ? $params['redirect'] : Request::url();
$data = Input::all();
if($data)
{
// Run validation and send message here
return Redirect::to($redirect)
}
return View::make('contact_form_view');
}
}
有一个页面 Controller 将根据使用的路由显示适当的页面 View ,其想法是用户可以将联系表单放入任何页面模板并通过从模板 View 中调用表单函数轻松自定义它如下图
<html>
<head>
</head>
<body>
{{ Contact::form(array(
'to' => 'myemail@mydomain.com',
'view' => 'contact_form_1',
)) }}
</body>
</html>
除了重定向之外,这一切都很好。成功提交表单并发送消息后,页面刷新并显示以下消息代替联系表单
HTTP/1.0 302 Found Cache-Control: no-cache Date: Tue, 17 Sep 2013 09:14:16 GMT Location: http://localhost:8888/my_initial_route Redirecting to http://localhost:8888/my_new_route.
大约 2 秒后,重定向发生,浏览器被重定向到用户在 $params 数组中提供的任何路由,如果没有提供重定向,则重定向到当前页面,如上例所示。
关于它为什么这样做的任何建议以及任何解决方案都会很棒。
谢谢!
编辑:
以下是我采用上述方法的原因的简要概述,这可能有助于理解问题:
该项目的一个要求是最终使用 cms 的开发人员可以通过 cms 控制面板单击“添加页面”按钮来创建无限数量的页面。这个想法是我们不会为我们想要创建的每个新页面编写新的页面 Controller 。有了这个,我想我有以下路线:
Route::any('{page_slug}/page', array('as' => 'frontend.page', 'uses' => 'FrontendPagesController@display_page'))->where('page_slug', '[-A-Za-z0-9_-]+');
大大瘦身的display_page函数是:
public function display_page($slug)
{
$page = PagesModel::getPageBySlug($slug);
return View::make($page['view_name']);
}
有了这个,用户可以通过点击按钮创建一个页面,给它一个名字和一个 slug,然后应用程序可以显示该页面和相应的 View ——在创建页面时定义——而无需添加任何新路线、 Controller 等。
问题出现在用户想要在页面中包含联系表单的情况下。我们如何知道他们是否会添加表单、他们将使用哪些字段以及需要进行哪些验证?我需要一种能够将完全自定义的联系表单添加到任何页面的方法,而无需开发人员触摸 cms 代码。我对此的解决方案是上面给出的方法:开发人员将标签放入 View 中并向函数传递一些参数,这些参数自定义表单功能。
Contact::form() 函数有点像表单的 Controller 。它获取并返回包含来自 html 的 View ,处理提交并根据结果返回成功/错误消息。
现在我不一定需要使用上述方法,但我需要一种方法将联系表单 Controller 与页面 Controller 分开,以便开发人员能够在不接触 cms 后端代码的情况下将表单添加到任何页面。
任何关于此的想法都会很棒。
最佳答案
您应该从 Controller 调用 redirect 而不是从 View 调用。发生这种情况是因为,您已经在 View 中并且它是可见的,所以如果您可以以某种方式隐藏它(正文),那么在重定向发生之前它不会可见。
但是,你做错了,anti-pattern,IMO。使用 Controller 做出决定, View 应该只用于展示。这是 MVC 框架中非常基本的规则。
关于php - Laravel - 从 View 中调用 Redirect::to(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18846035/
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我知道您通常应该在Rails中使用新建/创建和编辑/更新之间的链接,但我有一个情况需要其他东西。无论如何我可以实现同样的连接吗?我有一个模型表单,我希望它发布数据(类似于新View如何发布到创建操作)。这是我的表格prohibitedthisjobfrombeingsaved: 最佳答案 使用:url选项。=form_for@job,:url=>company_path,:html=>{:method=>:post/:put} 关于ruby-on-rails-rails:Howtomak
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article
我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file