Ruby on rails Rails 3中部分的动态渲染

Ruby on rails Rails 3中部分的动态渲染,ruby-on-rails,dynamic,rendering,render,partial-views,Ruby On Rails,Dynamic,Rendering,Render,Partial Views,在我正在开发的应用程序中,我在模型中定义了一个方法task\u types: task.rb def self.task_types ["ad_hoc"] end 我使用task\u types来填充下拉菜单,但我也希望使用它来动态渲染局部 我想的是,对于每种任务类型,都会有一个相关的注释框。我接着做了一个助手,它将根据选择的任务类型调用正确的分部: #tasks_helper.rb module TasksHelper def completion_comment(task)

在我正在开发的应用程序中,我在模型中定义了一个方法
task\u types

task.rb
  def self.task_types
["ad_hoc"]
  end
我使用
task\u types
来填充下拉菜单,但我也希望使用它来动态渲染局部

我想的是,对于每种任务类型,都会有一个相关的注释框。我接着做了一个助手,它将根据选择的任务类型调用正确的分部:

#tasks_helper.rb
module TasksHelper

  def completion_comment(task)
    task_types = @task.task_type
    render :partial => "#{Task.task_types}", :locals => {:task => task}
  end
end
不幸的是,当我调用completion\u comment时,我收到了错误消息
“部分名称([“ad\u hoc”])不是有效的Ruby标识符。”


我要寻找的是一种动态的方式来渲染适当的局部效果。我认为我的思路是正确的,但我不确定如何从我的
任务类型
方法中提取数组元素(正如您在错误消息中看到的,括号和引号被拉入渲染操作)。或者,我可能需要使用另一种方法来动态渲染局部。非常感谢您的帮助。

您需要一个字符串,而不是整个
任务类型
@task.task_type
应返回一个键,该键a)与任务类型数组中的元素匹配,b)与已知部分匹配

以下内容需要更复杂一些,但应该可以做到:

tasks_helper.rb
module TasksHelper

  def completion_comment(task)
    if Task.task_types.include? task.task_type
      render  :partial => task.task_type,
              :locals => {
                :task => task
              }
    else
      # render a generic comment box here
    end
  end
end
以下是有效的方法:

module TasksHelper

  def render_task_form(task)
    render :partial => "/tasks/completed/#{task.task_type.downcase}"
  end
end
我早就尝试过这个解决方案,但收到一个错误:“部分名称(/tasks/completed/)不是有效的Ruby标识符;请确保部分名称以字母或下划线开头,后面是字母、数字或下划线的任意组合。”


我再试了一次,为了解决这个问题,我删除了数据库中的所有任务。现在,部分将动态渲染。希望这对其他人有帮助

在Rails 4中,视图或部分名称应该响应有效的Ruby标识符。 因此,整个视图名称必须采用与ruby标识符相同的格式:

  • 它应该以u或字符开头
  • 它不能以数字开头
  • 它只能有u和字母数字
因此,考虑到task_类型是一个有效的ruby标识符(它应该是),它将起作用。在生成中,此代码在Rails 4中不起作用

render '/tasks/completed/some-task' 
但这会奏效的

render '/tasks/completed/some_task'  # note the underscore.

如果字符串起作用,可能是一个符号?尝试
:即席
而不是
“即席”
。或者有一个字符串对象很重要吗。。。哦,我明白了:我认为问题在于阵列…:-/同样的问题(部分名称([:ad_hoc])不是有效的Ruby标识符)…我想知道是否有一个方法可以在我的task_类型定义中调用,或者这是我在试图呈现部分时必须做的事情。数组不能被接受为部分名称。@ValeryKvon-是,这就是我遇到的问题…我想传递数组的元素,而不是数组本身,但我不确定应该如何进行。如果我必须改进我的整个方法,那很好。你是什么意思:传递数组的元素,比如什么?谢谢你的帮助。您提供的代码仍然为我提供了整个阵列,但我找到了一个可行的解决方案。