2012-12-13 136 views
0

这是我一直在努力解决的问题,但我还没有找到一种不觉得像彻头彻尾的黑客的方式。我有2个对象仓库和StateCity。 Warehouse对象具有StateCity对象的外键(state_city_id)。红宝石儿童父母形式

现在,当用户创建仓库时,我希望他们能够输入州和市。目前他们可以这样做,我只需检查州和市提交的参数,然后创建或找到相应的ActiveRecord对象。现在,当他们在我的视图中查看仓库时,我已经在使用助手从StateCity对象中提取状态/城市(如果它存在并在我的模型上添加方法以执行如下相同的功能)之间振荡起来

def show_state(warehouse) 
    if warehouse.state_city.nil? == false 
    return warehouse.state_city.state 
    end 
    return "" 
end 

def show_city(warehouse) 
    if warehouse.state_city.nil? == false 
    return warehouse.state_city.city 
    end 
    return "" 
end 

不幸的是,无论是辅助方法还是增加具有额外功能的模型似乎都是非常自然的,因为我必须使用一个来创建对象,另一个使用对象的维度。

我想知道是否有人有更好的方法来解决仓库StateCity问题的任何建议。任何帮助是极大的赞赏。

回答

1

首先,你可以写,如果这种说法就像这样:

return warehouse.state_city.city unless warehouse.state_city.nil? 

但我敢肯定这不是你正在寻找的答案。

我假设你总是希望仓库与StateCity相关联。如果是这种情况,那么无论何时创建仓库,您的用户总是需要选择州和城市,并且该逻辑由您的控制器处理并由您的仓库模型进行验证。

如果所有的验证是正确的,那么你需要在你的节目你的仓库模型的动作做的是从仓库取StateCity对象:

@state_city = warehouse.state_city 

然后在你看来只是进入字段@state_city.state@state_city.city。我不完全确定你是如何创建这些StateCity对象的,但这听起来很像你想要做的事情。

如果你的state_city是零,你可以根据你想要显示或不显示来处理它。如果你仍然想以随后显示仓库视图显示在视图中,你可以不喜欢

<% if @state_city %> 
    # Do something with the state city like display the state and city? 
<% end %> 

检查如果你想告诉用户更新状态的城市,例如,你会处理,从控制器通过做

unless @state_city 
    redirect_to "your edit action" and return 
end 

这将做的是它会检查你的state_city是否为空,那么它会重定向用户到任何你想要的动作。

+0

谢谢!我现在不能尝试,但我完全忘记了该视图可以访问控制器变量。如果它起作用,那么您是第一个选中该复选标记的人。但是,只有一个问题,如果我的state_city为空,该怎么办?我该如何做到这一点,以便我的观点不会在那件事上窒息(假设他们当时可能不确定state_city)?我可能不得不单独打破州和城市。 –