【问题标题】:Rails4 - Association has_many through - Reader_idRails4 - 关联 has_many 通过 - Reader_id
【发布时间】:2015-12-27 21:22:35
【问题描述】:

我想用 Rails 4 在 3 个模型之间做一个简单的关联,但我不能成功。

第一个模型:阅读器,第二个模型:评论第三个模型:书籍

三个模型之间的关系是:

类书

类注释

类阅读器

我对关系 Book has_many :cmets 没有问题,但我对关系 Reader has_many :cmets 有一些问题。

来自 CommentsTable 的字段:用户名、消息和 reader_id(用于 has_many 关联)。 ReaderTable 中的字段:姓名、电子邮件。

我有一个文件 _form.html.erb 在视图中:

<%= form_for [@book, @comment] do |f| %>

    <%= f.hidden_field :book_id %>
    <%= f.text_field :reader_id, :placeholder => "reader id" %>
    <br />
    <%= f.text_area :message %>
    <br />
    <%= f.submit %>
<% end %>

还有一个文件_comment.html.erb:

<% if comment.reader_id != nil %>
<li><strong><%= link_to comment.reader.name, comment.reader %></strong></li>
<p><%= comment.message %></p>
<% end %>

如您所见,我有一个带有 reader_id 和消息的表单。当用户输入这两个信息时,会出现 reader.name(感谢 reader_id)和 comment.message。 但我不希望用户输入整数“reader_id”(没有意义),而是直接输入字符串“reader.name”。 我怎么能做到这一点,知道之后我会在 reader.name 上做一个 link_to 到 comment.reader ?

请帮助我。 谢谢。

【问题讨论】:

    标签: ruby-on-rails-4 has-many-through model-associations


    【解决方案1】:

    我猜读者就是用户。如果是,那么您可能想要拥有一个完整的身份验证系统(也许考虑一下 Devise),并将评论分配给控制器中的当前用户。您还需要在控制器中分配图书。

    编辑:

    Devise 将在您的控制器中提供 current_user 方法。因此,您在 cmets 控制器中的创建方法应如下所示:

    def create
        comment = current_user.comments.new(comment_params)
    end
    

    您不需要将 reader.name 分配给 cmets。这就是协会的目的。您可以使用comment.reader.name,或者更好的是,使用委托(查找)并使用comment.reader_name。

    【讨论】:

    • 是的,我使用的是 Devise,读者就是用户。但我不知道如何为当前用户分配评论。我使用与设计的用户表只有字段:电子邮件、ID、密码。它没有字段“名称”(用于 cmets)。此外,我需要将 reader.name 分配给评论,因为我需要通过评论创建 reader_id 和书籍之间的关系(阅读器 has_many :books,通过: :cmets)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多