从宝石放置方法的位置

时间:2012-11-23 06:10:15

标签: ruby-on-rails view methods controller

我正在使用以下Acts as message gem来发送消息。 gem声明要将消息标记为已读取,请执行以下操作:

@ message.mark_as_read

下面是我的代码,我在其中迭代每条消息,然后我试图在视图中将消息标记为已读,但这不起作用。我收到错误“无法找到ID为true的商店”

通常我会在控制器或模型中设置一个方法来处理gem的方法,但是我很困惑我应该如何做到这一点,因为gem指的是数据库中的表,不需要新的模型或控制器。这真让我抓狂!我应该把这些方法放在哪里(还有更多这样的方法)?

任何想法?

    <% @messages.each do |m| %>
    <tr>
        <td>
        <%= link_to 'Mark Read', "#{m.mark_as_read}", :class => 'btn btn-mini' %>           
        </td>
    </tr>

    <% end %>

我的模特

class User < ActiveRecord::Base 

  acts_as_messageable :table_name => "messages",                         # default 'messages'
                      :required   => [:topic, :body],                     # default [:topic, :body]
                      :class_name => "ActsAsMessageable::Message",       # default "ActsAsMessageable::Message",
                      :dependent  => :nullify                            # default :nullify
end

1 个答案:

答案 0 :(得分:1)

您不能简单地添加一个调用上述方法的链接。

以下是您的代码所发生的情况:&lt;%= link_to'Mark Read',“#{m.mark_as_read}”%&gt;

解析模板时会调用m.mark_as_read,因此在呈现页面时,所有邮件实际上都已标记为已读。由于m.mark_as_read返回true,因此您将获得html <a href='true'>Mark Read</a>,这会导致您在路由到该路径时指定的错误。

您需要做的是创建一个动作(最好在MessagesController中),您可以在其中将消息标记为已读,然后将链接指向该地址,