Rails 3中部分动态渲染

时间:2013-03-07 22:18:55

标签: ruby-on-rails dynamic rendering render partial-views

在我正在处理的应用中,我在模型中定义了一个方法task_types

task.rb
  def self.task_types
["ad_hoc"]
  end

我使用task_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_comment时,收到了错误消息"The partial name (["ad_hoc"]) is not a valid Ruby identifier."

我正在寻找的是一种动态的方式来渲染适当的部分。我认为我走在正确的轨道上,但我不确定如何从我的task_types方法中提取数组元素(正如您在错误消息中看到的那样,括号和引号被拉入到渲染动作)。或者,也许我需要使用不同的方法来动态渲染部分。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:2)

这是有效的:

module TasksHelper

  def render_task_form(task)
    render :partial => "/tasks/completed/#{task.task_type.downcase}"
  end
end

我之前尝试过这个解决方案,并收到错误“部分名称(/ tasks / completed /)不是有效的Ruby标识符;请确保您的部分名称以字母或下划线开头,并且遵循通过字母,数字或下划线的任意组合。“

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

答案 1 :(得分:0)

您需要一个字符串而不是整个task_types数组。 @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

答案 2 :(得分:0)

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

  • 它应该以_或字符
  • 开头
  • 它不能以数字开头
  • 它只能有_和字母数字。

因此,考虑到task_type是一个有效的ruby标识符(它应该是),它将起作用。在生成此代码不适用于Rails 4

render '/tasks/completed/some-task' 

但这将有效

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