rails未定义属性的顺序

时间:2014-03-20 13:43:30

标签: ruby-on-rails ruby haml

我遇到需要向用户添加手机的情况,模型是:

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:简化了模型。

1 个答案:

答案 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以获取更多详细信息。