我正在尝试使用 FosRest 和 Symfony 表单为 Symfony 中的用户管理编写一个简单的 restful Controller 。我的应用程序由 Amazon DynamoDB 提供支持,但我认为这并不重要。
我的 DELETE、GET 和 POST(新用户)都运行良好。
我现在开始编写似乎不起作用的 PUT 操作(编辑用户)。我花了很长时间用头撞砖墙,但我无法解决。
为了创建 PUT,我基本上复制了 POST 操作,但修改它以首先加载旧对象。
在 POST 中,User 对象自动由行 $form->handleRequest($request); 填充
这似乎在 PUT 操作中不起作用,用户对象没有被填充/修改。我已经检查了 $_REQUEST 数组并且正在提交数据。由于缺乏对 PUT 的浏览器支持,我通过使用查询参数 _method=PUT 对数据执行 POST 来调用操作(这对于 DELETE 工作正常,并且路由到正确的位置)。
这是我的 POST Action :
public function postUsersAction(Request $request)
{
$user = new User();
$user->setTable($this->getTable());
$formBuilder = $this->createFormBuilder($user, array(
'validation_groups' => array('registration', '')))
->add('username', 'text')
->add('password', 'password')
->setAction($this->generateUrl('post_users'))
->setMethod('POST')
->setAttribute('validation_groups', array('registration'));
$roles = $this->getFlattenedRoles($this->getRoles());
$formBuilder->add('roles', 'choice', array(
'choices' => $roles,
'multiple' => true,
'expanded' => true
));
$form = $formBuilder->add('save', 'submit')->getForm();
$form->handleRequest($request);
if ($form->isValid())
{
$user->save();
$params = array('user' => $user);
$view = $this->view($params, 200)
->setTemplate("MyRestBundle:User:newconfirm.html.twig");
return $this->handleView($view);
}
$params = array('form' => $form, 'user' => $user);
$view = $this->view($params, 400)
->setTemplate("MyRestBundle:User:new.html.twig");
return $this->handleView($view);
}
这是我的 PUT Controller ,它没有:
public function putUserAction($slug, Request $request)
{
$table = $this->getTable();
$user = $table->load($slug);
$formBuilder = $this->createFormBuilder($user)
->add('password', 'password')
->setAction($this->generateUrl('put_user', array('slug' => $slug, '_method' => 'PUT')))
->setMethod('POST');
$roles = $this->getFlattenedRoles($this->getRoles());
$formBuilder->add('roles', 'choice', array(
'choices' => $roles,
'multiple' => true,
'expanded' => true
));
$form = $formBuilder->add('save', 'submit')->getForm();
$form->handleRequest($request);
if ($form->isValid())
{
$user->save();
$params = array('user' => $user);
$view = $this->view($params, 200)
->setTemplate("MyRestBundle:User:newconfirm.html.twig");
return $this->handleView($view);
}
$params = array('form' => $form, 'user' => $user);
$view = $this->view($params, 400)
->setTemplate("MyRestBundle:User:new.html.twig");
return $this->handleView($view);
}
如有任何帮助,我们将不胜感激。
最佳答案
好的,在 Symfony IRC channel 的一些帮助之后,事实证明这不起作用的原因是代码的这一部分:
$formBuilder = $this->createFormBuilder($user)
->add('password', 'password')
->setAction($this->generateUrl('put_user', array('slug' => $slug, '_method' => 'PUT')))
->setMethod('POST');
由于 PUT 在许多浏览器中不起作用,我试图将方法设置为 POST 并将 _method=PUT 作为查询参数传递以覆盖真正的 HTTP 方法。事实证明没有必要这样做,Symfony 会为你处理这一切。上面的代码现在只是:
$formBuilder = $this->createFormBuilder($user)
->add('password', 'password')
->setAction($this->generateUrl('put_user', array('slug' => $slug))
->setMethod('PUT');
通过这样做,Symfony 实际上呈现了一个带有隐藏 _method 字段的 POST 表单 - 无需手动执行任何操作。
关于php - PUT 请求不适用于 Symfony 表单和 FosRest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20633108/
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
我正在使用带有Rails的Devise,我想添加一个方法“getAllComments”,所以我这样写:classUser在我的Controller中:defdashboard@user=current_user@comments=@user.getAllComments();end当我访问我的url时,我得到了undefinedmethod`getAllComments'for#我做错了什么?谢谢 最佳答案 因为getAllComments是一个类方法,而您正试图将其作为实例方法访问。您要么需要访问它:User.getAllCom
我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)