2

我有一个包含followed_id、follower_id 和状态的关系表。我在我的用户模型中使用“多次通过”来创建关联。用户有很多关注,并且通过反向关系关注很多。当用户关注另一个用户时,状态默认为“已请求”。

因此,用户有一个关注者列表,每个关注者的状态为“已请求”。

我在这个追随者列表中需要的是一个带有 put 方法的 link_to 或一个仅找到该关系并将状态字符串更新为“已批准”的表单。看起来这很容易,但我已经搜索了好几天,无法弄清楚。这是我到目前为止所拥有的:

在 users_controller 中,将状态从“已请求”更改为“已批准”的操作:

def activate
  @user = User.find(params[:id])
  params[:status] = {:status => 'approved'}
  @user.status = params[:user][:status]
  @user.save
  render 'show_followers'
end 

这是在 users_controller 中列出关注者:

def followers
 @title = "Followers"
 @user = User.find(params[:id])
 @users = @user.followers.paginate(:page => params[:page])
 render 'show_followers'
end

这是我定义状态的地方,这在 user.rb 模型中可能不正确

def status
    Relationship.status.find_by_follower_id(self)
end

这是我向关注者展示的页面:

      <% unless @users.empty? %>
        <% @users.each do |user| %>
        <tr>
            <td><%= image_tag user.avatar.url(:thumb) %></td>
            <td><%= user.full_name %></td>
            <td><%= user.company %></td>
            <td><%= user.approval.status %></td>
        <%end%>
            <td><%= form_for @user, url: activate_user_path(@user), :html => { :method => :put } do |f| %>
                <%= f.submit "approve" %>
                <% end %>
            </td>

        </tr>
        <%= will_paginate @users %>
        <% end %>

有谁知道我如何才能将关系表中的字符串更新为“已批准”?

4

1 回答 1

2

我在您的表单中看到了一个潜在的问题,认为它应该是 foruser而不是@user& params[:user][:status]inactivate方法(params[:user][:status]应该是nil因为它尚未在您的方法中定义)。我宁愿在所有要批准的关注者旁边有一个远程链接,然后使用该链接更新状态,但这一点是以后的事。

所以,表格:

<%= form_for user, url: activate_user_path(user), :html => { :method => :put } do |f| %>
  <%= f.submit "approve" %>
<% end %>

并且,假设您可以访问当前用户,如果没有,也传递当前用户,即@user通过表单。

def activate
  user = User.find(params[:id]) # user to be approved
  relationship = current_user.relationships.where(:follower_id => user).first # relationship record that has above user as follower and current user as followed
  relationship.update_attributes!(:status => 'approved')
  # redirect to users#followers passing current_user
end 
于 2012-03-12T08:32:46.977 回答