Ruby on rails 在模型中渲染视图
我知道视图不应该从模型渲染,但我想不出更好的方法来处理这个问题 我有一个简单的表单,它应该以复选框的形式显示对象列表:Ruby on rails 在模型中渲染视图,ruby-on-rails,ruby-on-rails-4,rails-activerecord,simple-form,actionview,Ruby On Rails,Ruby On Rails 4,Rails Activerecord,Simple Form,Actionview,我知道视图不应该从模型渲染,但我想不出更好的方法来处理这个问题 我有一个简单的表单,它应该以复选框的形式显示对象列表: = f.association :results, collection: @search.results.all(order: 'cost'), as: :check_boxes 这样,它只会在复选框旁边显示对象,但我需要显示一组更详细的信息,因此我在模型中定义to_label方法,如下所示: class Result < ActiveRecord::Base b
= f.association :results, collection: @search.results.all(order: 'cost'), as: :check_boxes
这样,它只会在复选框旁边显示对象,但我需要显示一组更详细的信息,因此我在模型中定义to_label方法,如下所示:
class Result < ActiveRecord::Base
belongs_to :search
def to_label
"<div class='row'>
<div class='col-md-2'>#{supplier}</br><span class='label label-default'>#{brand}</span></div>
<div class='col-md-2'>#{desc}</div>
<div class='col-md-2'>#{model}</div>
<div class='col-md-1'>#{season}</div>
<div class='col-md-1'>#{qty}</div>
<div class='col-md-1'>#{expected_delivery}</div>
<div class='col-md-1'>#{msrp}</div>
<div class='col-md-1'>#{cost}</div>
</div>".html_safe
end
end
def to_label
render "results/label"
end
当然rails不允许我这样做,但我对如何实现它没有更好的想法。您不应该从模型访问视图。相反,创建一个助手,其函数接收结果对象作为参数(代码未测试): 助手/结果\u helper.rb
result_to_label(result)
render(:template =>"results/label", :layout => nil , :locals => { :result => result }).to_s
end
然后,从视图中直接调用result\u到\u标签(结果)
更新
在您的简单表单中,您可以添加label\u方法
:
您不应该从模型访问视图。相反,创建一个助手,其函数接收结果对象作为参数(代码未测试): 助手/结果\u helper.rb
result_to_label(result)
render(:template =>"results/label", :layout => nil , :locals => { :result => result }).to_s
end
然后,从视图中直接调用result\u到\u标签(结果)
更新
在您的简单表单中,您可以添加label\u方法
:
这样弯曲铁轨会把你带到你不想去的地方。首先,您试图通过使简单的表单成为表单控件的标签来呈现复杂的html布局。在不使用简单表单的情况下构建自定义表单更有意义。因为通过自动标签生成呈现简单控件是一件很简单的事情。你已经远远超越了这一点 因此,我认为解决您问题的方法是在您的课堂上定义:
class Result < ActiveRecord::Base
def to_partial_path
'results/form'
end
end
它可以在简单表单内部呈现,您只需要使用rails或简单表单助手构建表单控件。这样弯曲rails将使您到达不想到达的地方。首先,您试图通过使简单的表单成为表单控件的标签来呈现复杂的html布局。在不使用简单表单的情况下构建自定义表单更有意义。因为通过自动标签生成呈现简单控件是一件很简单的事情。你已经远远超越了这一点 因此,我认为解决您问题的方法是在您的课堂上定义:
class Result < ActiveRecord::Base
def to_partial_path
'results/form'
end
end
它可能在简单表单中呈现,您只需要使用rails或简单表单帮助程序构建表单控件。我不确定我是否理解如何将其传递给简单表单关联。标签法适用于什么?“=f.association:results,collection:@search.results.all(顺序:'cost'),as::复选框,label\u method:?”您的解决方案对回答我的问题非常有用。无论如何,这是一个地狱的维护和扩展。我要转到@Sergey Moiseev的解决方案。谢谢。我不确定我是否理解我应该如何将它传递给简单形式协会。标签法适用于什么?“=f.association:results,collection:@search.results.all(顺序:'cost'),as::复选框,label\u method:?”您的解决方案对回答我的问题非常有用。无论如何,这是一个地狱的维护和扩展。我要转到@Sergey Moiseev的解决方案。谢谢。听起来是一个很好的解决方案,但我会接受@Sergio的回答,因为它保持了简单的形式。好吧,在扩展解决方案时请考虑一下。我刚刚在我的一个项目上讲了同样的故事,并通过完全删除简单表单甚至rails表单字段来完成它,用json api和angularjs替换它们。我必须在简单的表格中手工创建表格。在阅读了文档之后,这比看起来要容易得多。只需要创建这样一个表:“-@search.results.each do | result |”并在我的表中插入这样一个复选框:“%td=check_-box_-tag”quote[result_-id][]”,result.id“听起来是个不错的解决方案,但我会接受@Sergio的答案,因为它保持了简单的形式OK,在扩展解决方案时请考虑一下。我刚刚在我的一个项目上讲了同样的故事,并通过完全删除简单表单甚至rails表单字段来完成它,用json api和angularjs替换它们。我必须在简单的表格中手工创建表格。在阅读了文档之后,这比看起来要容易得多。只需要创建一个如下表:“-@search.results.each do | result |”并在我的表中插入一个复选框:“%td=check_box_tag”quote[result_id][]”,result.id”