Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.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 RubyonRails:在一个动作中使用多个respond\u来阻止是好的:最佳实践_Ruby On Rails_Ruby_Controller_Action_Response - Fatal编程技术网

Ruby on rails RubyonRails:在一个动作中使用多个respond\u来阻止是好的:最佳实践

Ruby on rails RubyonRails:在一个动作中使用多个respond\u来阻止是好的:最佳实践,ruby-on-rails,ruby,controller,action,response,Ruby On Rails,Ruby,Controller,Action,Response,我需要做条件检查是否渲染这个或那个。 使用respond\u to块包装条件检查是否良好? 像 或 我将在if..else中有多个响应到块 像 推荐的最佳方法是什么?在我看来,控制器操作的代码太多了。Rails是基于方法论构建的,因此您可以尝试以下方法: 如果你这样说: class SomeController < ApplicationController respond_to :html, :json , :js 要直接回答您的问题: 带有单个respond_to块的第一个选项

我需要做条件检查是否渲染这个或那个。 使用
respond\u to
块包装条件检查是否良好? 像

我将在if..else中有多个
响应到
块
像


推荐的最佳方法是什么?

在我看来,控制器操作的代码太多了。Rails是基于方法论构建的,因此您可以尝试以下方法:

如果你这样说:

class SomeController < ApplicationController
  respond_to :html, :json , :js

要直接回答您的问题:
带有单个
respond_to
块的第一个选项更合理,因为它涉及编写更少的代码。正如我前面提到的,Rails完全是为了避免重复,条件运算符中的两个响应块不符合编写Rails应用程序的风格。

此方法是否根据请求数据类型切换响应内容?不幸的是,否。如果您想使用不同的响应格式,您仍然必须使用respond_to blocks。我更新了我的答案,让你对你的问题有一个更好的看法,但我在某个地方读到,在
respond\u to
块中编写逻辑是不好的。我的第一种方法不是违反了这个惯例吗?我不知道你在哪里读到这篇文章(也许如果你提供了一个很棒的来源),但是从风格上看,第二种写作方法效率很低。另外,不管条件是真是假,你还是要使用一个响应。所以在性能方面,我认为这也不重要。
if @applicant.user_id.nil?
  # Some logic
  respond_to do |format|
    format.js
    format.html { redirect_to applicant_path(params[:id]) }
  end
else
  respond_to do |format|
    format.json { render json: {message: t('_applicants.flash.applicant_already_assigned')}, status: 400 }
  end
end
class SomeController < ApplicationController
  respond_to :html, :json , :js
def someaction
 if aplicant.id.nil?
  redirect_to applicant_path(params[:id])
 end
 else
    flash[:notice] = "Applicant already assigned" 
 end
end