2010-10-27 113 views
1

我正在用rails3上的ruby制作一个简单的BBS系统。Rails 3模型协会

3个主要模式是会员/分类/文章。

文章属于会员/类别,(db表中的member_id/category_id列) 和每个成员/类别'has_many'文章。

当特定用户试图写一篇文章,我试图通过它

def new 
    @article = current_member.articles.new 
end 

,并且当没有任何形式的输入或任何被创建的制品自动填充在member_id部分。

现在,我应该怎么做,如果我想自动填充文章的category_id列? 我相信每个数据相关的工作都应该在模型中完成。不过,我传递:类别值通过URL

例如,

本地主机:3000 /用品/ QNA /新

将意味着物品应具有2 CATEGORY_ID(假设有ID类别= 2有name = qna,同样,我做了路由作业,我可以成功地从params [:category]中获得'qna')。

我应该使用

def create 
    current_member.articles.build(:category => get_category_id_from_name(params[:category])) 
end 

?但是没关系?因为我相信因为模型不能访问params变量,所以控制器必须完成上述工作,那不是'rails方式' 我不想使用嵌套表单,因为我不希望用户在写入时选择一个类别。它就像是一个QnA板,如果用户点击'写'按钮,这意味着用户正在写一个QnA板。

回答

1

最简单的方法是在创建Article实例的表单上添加两个隐藏字段,然后将“category_id”和“member_id”的值分配给这些隐藏字段。

Rails会自动将这些参数拖入params哈希中,并且它们会在您调用Article.new时自动结束。

+0

是的,我想到了这一点,但如果用户使用ex)firefox,将隐藏的只读变量更改为其他内容? – user482594 2010-10-27 23:04:56

+1

如果它仍然是有效的类别ID,那么我不会看到问题。除非只有一些成员可以发布到某些类别。无论谁去改变这个隐藏的形式价值的麻烦显然都是无花果的。您可以检查控制器,以查看URL中类别的类别ID是否与隐藏输入中传递的ID匹配,如果不是这种情况,则不保存该文章。虽然我在RoR中已经足够绿了,不知道该怎么做。 – sholsinger 2011-03-24 00:04:39