2016-06-28 16 views
0

Ich habe derzeit ein Problem, bei dem ich versuche, die Fähigkeit einzustellen, dass nur der Benutzer, der eine Gruppe erstellt hat, eine Gruppe bearbeiten oder löschen kann. Ich erhalte die folgende Fehlermeldung: nicht definierte Methode `Benutzer für #Problem mit dem aktuellen Benutzer Bearbeiten/Löschen in Schienen 4

Ich habe den folgenden Code in meiner Gruppe Index Controller:

<% @nearby_groups.each do |group| %> 
    <h1><%= group.topic %></h1> 
    <p><%= group.description %></p> 
    <% if current_user.id == group.user.id %> 
    <%= link_to "Edit", edit_group_path(group), class: "ui black button" %> 
    <%= link_to "Delete", group_path(group), method: :delete, data: { confirm: "Are you Sure?"}, 
    class: "ui inverted red button " %> 
    <% end %> 
<%= link_to "show", group_path(group), class: "ui inverted blue button" %> 
<% end %> 

Auf meiner Gruppe zeigen Seite Ich habe den folgenden Code:

<h1>The <%= @group.topic %> Group!</h1> 
    <p>Description: <em><%= @group.description %></em></p> 
    <p>Group Address: <em><%= @group.address %></em></p> 
    <p>Group City: <em><%= @group.city %></em></p> 
    <p>Group State: <em><%= @group.state %></em></p> 
    <% if current_user.id == @group.user.id %> 
    <%= link_to "Edit", edit_group_path(), class: "ui black button" %> 
    <%= link_to "Delete", group_path(), method: :delete, data: { confirm: "Are you Sure?"}, 
    class: "ui inverted red button " %> 
<% end %> 

sieht Meine Gruppen-Controller wie folgt aus:

def index 
    @groups = Group.includes(:comments) 
    end 

    def show 
    @group = Group.find(params[:id]) 
    end 

Schließlich loo meine Gruppen Modell ks wie folgt aus:

class Group < ActiveRecord::Base 
    has_many :collections 
    has_many :comments 
    has_many :users, :through => :collections 

    validates :topic, presence: true 
    validates :description, presence: true, length: { minimum: 10 } 
    validates :address, presence: true 
    validates :city, presence: true 
    validates :address, presence: true 

    geocoded_by :address 
    after_validation :geocode 
end 

Wieder auf meine beiden Index und zeigen Seiten für Gruppe bekomme ich folgende Fehlermeldung: nicht definierte Methode `Benutzer für # Sie für jede Hilfe danken.

Antwort

0

Wechsel:

<% if current_user.id == @group.user.id %> 

An:

<% if current_user.id == @group.try(:user).try(:id) %> 

Oder zu berücksichtigen current_usernil sein, wenn der Benutzer nicht angemeldet ist aus:

<% if current_user and current_user.id == @group.try(:user).try(:id) %> 

Referenz:

# +try+ calls can be chained: 
# 
# @person.try(:spouse).try(:name) 

über: https://github.com/rails/rails/blob/be589a8b01500a4b52a86248458bf57597e568e8/activesupport/lib/active_support/core_ext/object/try.rb#L16


Hinweis: Diese Antwort nicht berücksichtigt Active Record Assoziation Fragen: http://guides.rubyonrails.org/association_basics.html#the-types-of-associations


aktualisieren

nach Ihren has_many_through Arsch ociation sollte der Plural Group#users ein Active Record-Beziehungsobjekt zurückgeben, das wie ein Array aussieht, das zugehörige Benutzer enthält.

Wechseln zu:

<% if current_user and @group.users.map {|user| user.id}.include?(current_user.id) %> 

Diese Art der Logik sollte zum Modell Schicht bewegt werden, zum Beispiel:

# app/models/users.rb 
class User 
    def has_group_access?(group_id) 
    Collection.find_by_group_id_and_user_id(group_id, self.id) 
    end 
end 

# app/views/whatevs.html.erb 
<% if current_user and current_user.has_group_access?(@group.id) %> 

Update 2

Wenn Gruppe gehört zu Benutzer, dann ändern Sie zu:

+0

Dies funktionierte teilweise - die Fehlermeldungen verschwanden, aber sogar mit dem Benutzer, der eine Gruppe erstellt hat, können sie sie nicht bearbeiten. Irgendwelche Lösungen? –

+0

Ich brauche mehr Informationen, um zu beurteilen, was das Problem ist. Ich habe das Gefühl, dass es ein Assoziationsproblem mit 'has_many_through' ist. Gehe in die 'rails console' von der Kommandozeile aus und 1)' @group = Group.find (your_group_id_that_has_); @ group.user # => sollte ein Benutzerrecht zurückgeben? '. Dann sollte 2) '@group.users # => alle zugehörigen Benutzer zurückgeben? 'LMK, wenn 1 und 2 funktioniert - ich könnte eine Lösung für Sie haben. – SoAwesomeMan

+0

okay, eintippen in group = Group.find (1) Ich bekomme die Gruppen-ID zurück von 1. Wenn ich jedoch in group.user 1 tippe ich bekomme die Schienen-Konsole Fehlermeldung. Hilft das? Lassen Sie mich wissen, welche anderen Informationen Sie benötigen! –