0

我有一个用户控制器和一个通知控制器。用户 has_many 通知通过许多其他模型。有没有一种在我的通知#destroy 操作中定义@user 的好方法,以便我可以在我的javascript 中引用它?

在我的用户显示页面上,我有这样的东西。

用户/show.html.erb

<div>

  <div id="user_notificationss_count">
    "You have <%= @user.notifications.count %> notifications"
  </div>

  <%= render @user.notifications %>

</div>

通知/_notification.html.erb

  <div id="notification_<%= @notification.id %>">
    <div>Congrats, you have earned XXX badge!</div>
    <div><%= link_to 'X', notification, method: :delete, remote: true %></div>
  </div>   

users_controller.rb

def show
  @user = User.find(params[:id])
end

通知控制器.rb

def destroy
  @notification= Notification.find(params[:id])
  @notification.destroy
  respond_to |format|
    format.html { redirect_to :back }
    format.js
  end
end

通知/destroy.js.erb

$("#notification_<%= @notification.id %>").remove();
$("#user_notifications_count").html("You have <%= @user.notifications.count %> notifications");

在 javascript 中,第一行.remove();正常工作。但是,第二行不起作用,因为我没有在控制器销毁操作中定义 @user。我的用户模型 has_many 通知通过多个其他模型。因此,每个通知都没有特定的 user_id。有没有办法从我呈现的 user#show 页面获取 user_id 参数?

对不起,如果我不清楚。请让我知道,我将补充额外的解释/代码。谢谢!


编辑:添加模型代码

用户.rb

attr_accessible :name
has_many :articles
has_many :comments
has_many :badges

def notifications(reload=false)
  @notifications = nil if reload
  @notifications ||= Notification.where("article_id IN (?) OR comment_id IN (?) OR badge_id IN (?)", article_ids, comment_ids, badge_ids)
end

文章.rb

attr_accessible :content, :user_id
belongs_to :user
has_many :notifications

评论.rb

attr_accessible :content, :user_id
belongs_to :user
has_many :notifications

徽章.rb

attr_accessible :name, :user_id
belongs_to :user
has_many :notifications

通知.rb

attr_accessible :article_id, :comment_id, badge_id
belongs_to :article
belongs_to :comment
belongs_to :badge
4

1 回答 1

1

在模型中设置虚拟属性Notification会起作用:

# app/models/notification.rb
class Notification < ActiveRecord::Base
    belongs_to :article, :comment, :badge

    def user
        if article_id.nil? && comment_id.nil?
            badge.user
        elsif comment_id.nil? && badge_id.nil?
            article.user
        elsif badge_id.nil? && article_id.nil?
            comment.user
        end
    end
end

destroy然后,您可以在通知控制器的操作中查找父级:

# app/controllers/notifications_controller.rb
def destroy
    @notification= Notification.find(params[:id])
    @user = @notification.user
    ...
end

@user正如您在上面的代码段中所指出的那样,您随后将能够访问实例变量destroy.js.erb

于 2013-06-15T23:21:16.023 回答