如何在1个函数中添加2个参数?

时间:2016-10-18 18:06:26

标签: ruby-on-rails ruby

我是Rails的新手,我正在做Hartl的教程,但是我想在代码中添加一些特殊的东西。我现在正在做微博,我想添加“删除”功能来删除微博,但我希望这个功能只对管理员和制作这个微博的用户可见。现在我不知道该怎么做,因为当我想设置<% if current_user(micropost.user) && user.admin %>时,我收到错误wrong number of arguments (given 1, expected 0)。 在session_helper.rb我有函数def current_user而不是def current_user(micropost.user)我知道但我能以某种方式添加这个micropost.user并完成这项工作吗?贝娄所有代码:

app/views/microposts/_micropost.html.erb

<li id="micropost-<%= micropost.id %>">
  <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %>
  <span class="user"><%= link_to micropost.user.name, micropost.user %></span>
  <span class="content"><%= micropost.content %></span>
  <span class="timestamp">
    Posted <%= time_ago_in_words(micropost.created_at) %> ago.
  </span>
  <% if current_user(micropost.user) && user.admin %>
   <%= link_to "delete", micropost, method: :delete,
                         data: { confirm: "You sure?" } %>
  <% end %>
</li>        

app/helpers/session_helper.html.erb

def current_user
  if (user_id = session[:user_id])
    @current_user ||= User.find_by(id: user_id)
  elsif (user_id = cookies.signed[:user_id])
    user = User.find_by(id: user_id)
    if user && user.authenticated?(:remember, cookies[:remember_token])
      log_in user
      @current_user = user
    end
  end
end    

2 个答案:

答案 0 :(得分:2)

您应该只是检查if current_user == micropost.user。没有理由向current_user添加一个参数,这样做会使该方法的目的更加明显。方法current_user(something)绝不意味着当前用户和参数之间的相等性检查,并且违反了一个非常常见的Rails实践,即定义一个名为current_user的方法以返回当前经过身份验证的用户。

如果要定义检查给定用户是否是当前用户的附加方法,则应使用current_user?(user)。它会像这样使用......

<% if current_user?(micropost.user) && user.admin %>

并定义如下:

def current_user?(user)
  current_user == user
end

答案 1 :(得分:0)

meagar是正确的,你不应该为该方法添加参数。但是为了允许参数所有你需要做的就是将def线更改为类似的东西,然后只引用你要调用它的user参数,再次是坏主意,但你是成年人。

def current_user(user)