在我正在处理的应用中,我在模型中定义了一个方法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
方法中提取数组元素(正如您在错误消息中看到的那样,括号和引号被拉入到渲染动作)。或者,也许我需要使用不同的方法来动态渲染部分。任何帮助表示赞赏。
答案 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.