从助手

时间:2015-09-24 23:22:42

标签: ruby-on-rails logic social-networking

我正在社交媒体网站上工作,我在个人资料页面遇到问题。在我解释你确切的问题之前,让我解释一下我实际上要做的事情。

想象一下Facebook ...当你进入某人的个人资料页面时,你会看到一个“添加好友”按钮。但是如果你回到你的页面,你将看不到相同的“添加好友”按钮,即使他们使用相同的视图。这就是我想要做的。我做到了。到目前为止没问题。

我的问题从这里开始。我想根据友谊表切换“添加朋友”的颜色,文字和href。

所以,如果我不是一个人的朋友,当我进入人的页面时,会出现“添加朋友”。 (已完成。)但是如果我已经发送了请求并等待其他用户响应,我想将按钮颜色更改为黄色,将文本更改为“取消请求”和href。

这是我的助手,这个方法是否显示是否显示按钮:

module ProfilesHelper

  # display_buttons
  # ---------------
  # Purpose of this helper is to find out if user is in his/her own profile page.
  # According to that, this statement will decide to display buttons or not.

  def display_buttons
    if (params[:id].to_s == current_user.id.to_s) || ((params[:username].to_s == current_user.username.to_s) && !params[:username].to_s.blank?)
      # This is current user's profile, that's why do not display buttons.
    else
      render 'common/profile_buttons'
    end
  end

end

现在,我已经设计了一堆if语句来确定在配置文件中使用哪个按钮。并将代码实现到上面的代码中。

module ProfilesHelper

  # display_buttons
  # ---------------
  # Purpose of this helper is to find out if user is in his/her own profile page.
  # According to that, this statement will decide to display buttons or not.

  def display_buttons
    if (params[:id].to_s == current_user.id.to_s) || ((params[:username].to_s == current_user.username.to_s) && !params[:username].to_s.blank?)
      # This is current user's profile, that's why do not display buttons.
    else
      if user_id == current_user.id && friend_id == params[:id] && status == 'pending'
        # Cancel Request, (Yellow Button)
      elsif user_id == params[:id] && friend_id == current_user.id && status == 'requested'
        # Accept Request, (Green Button)
      elsif  user_id == current_user.id && friend_id == params[:id] && status == 'accepted'
        # Unfriend, (Red Button)
      else
        # Add Friend, (Blue Button)
        render 'common/profile_buttons'
      end
    end
  end

end

好的,我的第一个问题是,friend_id,user_id和status在友谊表中。如何访问此列,以便我可以使if语句有效?

第二个问题:正如你在else语句中看到的那样,我使用render来显示按钮。因此,在我使这个if语句工作之后(在你的帮助下),我需要传递变量或以某种方式操纵来自helper的渲染。那么,我该怎么做呢? (如果我使用单独的按钮部分并呈现正确的按钮,我可以解决问题,但我会重复自己。所以,这不是我猜的正确方法。)

顺便说一句,这是profile_buttons partial:

<div class='buttons'>
  <%= link_to 'Add Friend', add_path(@profile.id), :class => 'btn btn-primary btn-sm button' %>
  <%= link_to 'Send Message', profile_path, :class => 'btn btn-default btn-sm button' %>
</div>

谢谢。

修改

我想我想出了从helper访问数据库的方法。我在控制器中定义了这个:

@friendship = Friendship.find_by_user_id_and_friend_id(current_user.id,@ profile.id)

因此,通过在user_id等前添加@friendship,我可以访问它们。但@ profile.id是零。不知道为什么。但是我可以在视图中打印@ profile.id。

1 个答案:

答案 0 :(得分:0)

通过根据友谊状态为您的按钮分配一个类,您可以更轻松地实现这一目标:

#app/helpers/application_helper.rb
class ApplicationHelper
    def friendship_button_class
      if current_user?
         friendship = current_user.friendships.find params[:id]
         case friendship.status
            when 'pending'
               @your_class = "green"
            when 'requested'
               @your_class = "yellow"
            when 'accepted'
               @your_class = "red"
         else
             @your_class = "blue"
         end
      end
      @your_class #-> never call a variable "class" && rails automatically returns the last line of a helper, so need for "return"
    end
end

您必须使用模型进行备份:

#app/models/user.rb
class User < ActiveRecord::Base
   has_many :friendships, foreign_key: :user_id, association_foreign_key: :friend_id
   has_many :friends, through: :friendships
end

#app/models/frienship.rb
class Friendship < ActiveRecord::Base
   #columns id | user_id | friend_id | status | created_at | updated_at
   belongs_to :user
   belongs_to :friend, class_name: "User"
end

仅使用帮助程序来定义代码块。 IE将您的逻辑保留在您的视图中:

#app/views/profiles/show.html.erb
<%= link_to "Friendship Button", class: "button " + friendship_button_class unless current_user == @user %>

CSS的神奇之处在于您可以使用:before伪元素更改按钮文本:

#app/assets/stylesheets/application.css
a.button {
   /* button styling */
}
a.button.green {
   position: relative;
   background-color: green;
}
a.button.green:before{
   content: "Friend Requested";
}