我知道不应该从模型中呈现视图,但我无法理解处理此问题的更好方法。
我有一个simple_form表单,应该将对象列表显示为复选框:
= 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
这显示了一些更好的格式化信息,但它仍然变得非常复杂,我需要在某些时候添加像图像等信息。当然,从MVC的角度来看,它也是非常错误的。
我的想法是在应用程序/视图中创建一个部分,使用haml和我的应用程序的其余部分,并使我的to_label方法看起来像这样:
def to_label
render "results/label"
end
当然rails不允许我这样做,但我对如何实现它没有更好的了解。
答案 0 :(得分:3)
您不应该从模型访问视图。相反,使用函数创建一个帮助器,该函数将结果对象作为参数接收(代码未测试):
<强>助手/ results_helper.rb 强>
result_to_label(result)
render(:template =>"results/label", :layout => nil , :locals => { :result => result }).to_s
end
然后,在您看来,您可以直接致电result_to_label(the_result)
。
<强>更新强>
在simple_form中,您可以使用lambda添加label_method
:
= f.association :results, collection: @search.results.all(order: 'cost'), label_method: lambda { |res| result_to_label(res) }
答案 1 :(得分:1)
以这种方式弯曲导轨会让你到达你不想去的地方。首先,您尝试通过使simple_form认为它是表单控件的标签来渲染复杂的html布局。在不使用simple_form的情况下构建自定义表单更有意义。因为使用自动标签生成渲染简单控件有点简单。而你远远超出了这一点。
因此,对我来说,解决问题的方法是在您的课程中定义to_partial_path:
class Result < ActiveRecord::Base
def to_partial_path
'results/form'
end
end
并使用以下内容呈现表单:
= render @results
它可以在简单形式内呈现,您只需要使用rails或简单的表单助手构建表单控件。