我遇到需要向用户添加手机的情况,模型是:
User
attr_accessible :name
has_many :phones
Phone
attr_accesible :number, :type, :user_id
belongs_to :user
更新@user时,我会构建一个临时手机以在视图中显示。
...
def show
@user.phones.build(:type => 'default') if @user.phones.size == 0
end
def update
#get params from view, validate, and save
end
在Haml我有
...
- @user.phones.each_with_index do |p, index|
# inputs for edit existing phones, or if this is the first time, add new one.
我这样没有问题,但是我需要通过它的ID订购手机,所以我有:
...
- @user.phones.order('id ASC').each_with_index do |p, index|
# inputs for edit existing phones, or if this is the first time, add new one.
当用户拥有几乎一个(在数据库中)手机时,它可以正常工作,但如果这是第一次添加新手机,则输入表单不会显示,因为我使用具有:type
属性的临时手机仅
我修补此视图中添加条件:
...
- if @user.phones.size == 0
#add default inputs
- else
- @user.phones.order.each_with_index do |p, index|
# html inputs...
并从控制器中删除临时电话:
...
def show
#@user.phones.build(:type => 'default') if @user.phones.size == 0
end
def update
#get params from view, validate, and save
end
它工作正常,但我认为有更好的解决方案。我做得对不对?
pd:简化了模型。
答案 0 :(得分:0)
我觉得主要问题在于
@user.phones.order.each_with_index
而不是通过手机循环每个,你只需要通过提取部分手机来重构你的视图。如果您需要部分内部的计数器,您只需使用导轨为您提供的收集计数器。搜索单词计数器here。 之后你可以在你的视图中写下这样的东西:
= render partial: 'phone/default' if @user.phones.size == 0
= render partial: 'phone/item', collection: @user.phones.order
您甚至可以更进一步,在手机课程中定义to_partial_path方法并编写如下内容:
= render @user.phones.order
因此,请阅读部分here以获取更多详细信息。