我正在社交媒体网站上工作,我在个人资料页面遇到问题。在我解释你确切的问题之前,让我解释一下我实际上要做的事情。
想象一下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。
答案 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";
}