2016-10-18 5 views
0

Ich bin neu in Rails, ich mache Tutorial von Hartl, aber ich möchte manchmal etwas Besonderes von mir zum Code hinzufügen. Ich mache gerade Mikro-Dateien und ich möchte die Funktion "Löschen" hinzufügen, um Mikro-Dateien zu löschen, aber ich möchte, dass diese Funktion nur für den Administrator sichtbar ist und für Benutzer, die diese Mikro-Datei erstellt haben. Jetzt weiß ich nicht, wie man das macht, denn wenn ich <% if current_user(micropost.user) && user.admin %> einrichten will bekomme ich einen Fehler wrong number of arguments (given 1, expected 0). In session_helper.rb habe ich Funktion def current_user nicht def current_user(micropost.user) Ich weiß, aber kann ich irgendwie diese micropost.user hinzufügen und das getan? Bellow gesamten Code:Wie kann ich 1 Argumente zu 1 Funktion hinzufügen?

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  

Antwort

2

sollten Sie einfach die gewünschten if current_user == micropost.user sein. Es gibt keinen Grund, current_user ein Argument hinzuzufügen, und dies würde den Zweck dieser Methode viel weniger offensichtlich machen. Die Methode current_user(something) impliziert in keiner Weise eine Gleichheitsüberprüfung zwischen dem aktuellen Benutzer und dem Argument und verletzt eine ziemlich gängige Rails-Methode zum Definieren einer Methode namens current_user, um den aktuell authentifizierten Benutzer zurückzugeben.

Wenn Sie eine zusätzliche Methode definieren möchten, die überprüft, ob der angegebene Benutzer der aktuelle Benutzer ist, sollten Sie current_user?(user) verwenden. Es wäre so ... wie diese

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

und definiert werden:

def current_user?(user) 
    current_user == user 
end 
+0

Verdammt einfach Ich habe nicht darüber nachgedacht. Vielen Dank! – hydroxyzinum

+0

BTW, hast du irgendwelche Vorschläge, wie kann ich auch die Funktion für den Administrator definieren? Wenn ich auf den Löschen-Button als Admin klicke, werde ich zu root_url weitergeleitet, ohne den Post zu löschen ... – hydroxyzinum

0

meagar korrekt ist, sollten Sie nicht hinzufügen Parameter für diese Methode. Aber um Parameter zu berücksichtigen, müsste man nur die def-Zeile ändern, dann referenziere einfach das Argument user, wo du es nennen willst, wieder eine schlechte Idee, aber du bist ein Erwachsener.

def current_user(user) 
Verwandte Themen