2016-04-21 25 views
1

Ich möchte, dass meine App current_user ein Buch hinzufügt, wenn er auf den Link klickt. Mein Code scheint in Ordnung zu sein, es gibt keine Fehler, aber nach dem Klicken auf den Link passiert nichts.So rufen Sie eine Methode vom Controller über link_to auf?

book.rb:

has_many :book_users 
has_many :users, through: :book_users 

user.rb:

has_many :book_users 
has_many :books, through: :book_users 

book_user.rb:

belongs_to :book 
belongs_to :user 

books_controller.rb:

before_action :is_admin?, except: [:book_params, :add_to_books_i_read, :index] 
before_filter :authenticate_user! 
expose(:book, attributes: :book_params) 
expose(:books) 


    def create 
    if book.save 
     redirect_to(book) 
    else 
     render :new 
    end 
    end 

    def update 
    if book.save 
     redirect_to(book) 
    else 
     render :edit 
    end 
    end 

    def add_to_books_i_read(book_id) 
    current_user.books << Book.find(book_id) 
    end 

In meinem Indexansicht Ich habe

ul 
    -books.each do |book| 
    li 
     = link_to "#{book.name}", book_path(book) 
     = link_to " Add to my books", {:controller => "books", method: :add_to_books_i_read, book_id: :book.id} 

Also, was mache ich falsch? Warum macht meine Methode add_to_books_i_read nichts? Die Tabelle in der Datenbank book_users zeichnet nichts nach dem Klicken auf dieses link_to auf, aber es funktioniert gut selbst (ich über die Konsole überprüft). Was kann ich tun? Wie können Benutzer Bücher über die Methode hinzufügen und diese Methode korrekt aufrufen? Jede Hilfe wäre willkommen, danke!

Antwort

0

Oh Gott. Mit deiner Ratschlaghilfe habe ich es endlich geschafft!So

Controller:

def add_to_books_i_read 
    current_user.books << Book.find(params[:id]) 
    redirect_to(:back) #this line 
end 

In Routen

resources :books do 
    member do 
     get :add_to_books_i_read 
    end 
end 

Indexansicht

-books.each do |book| 
    li 
     = link_to "#{book.name}", book_path(book) 
     = link_to "  Add to my books", add_to_books_i_read_book_path(book) 

Vielen Dank für Ihre Hilfe! Ich bin wirklich sehr dankbar! :)

1
= link_to " Add to my books", {:controller => "books", action: :add_to_books_i_read, book_id: :book.id} 
+0

Ja, ich habe schon versucht, aber es immer noch tut nichts ( – Jakov

+0

Sie Protokolle einchecken können, wenn diese Aktion aufgerufen wird? –

+0

Ja, dann ist es mit Admin ok. Und ja, es heißt – Jakov

1

Die erste, method im link_to ist die symbol of HTTP verb, so dass Sie nicht Ihre Funktion in der Steuerung auf Sie neue Aktion zu definieren und verwenden passieren können Sie Route für die see here

1

definieren Controller benötigen Seit add_to_books_i_read ist eine Controller-Aktion Methode sollten Sie Ihre Routen aktualisieren, um diese Aktion für books Ressourcen zu integrieren, um gut mit Rails Art und Weise zu tun, auf eine findige Weise zu tun. Sie erhalten auch eine URL Helfer für diesen Pfad zu verwenden, die wie folgt aussehen:

/books/:id/add_to_books_i_read

Ihr Code könnte wie folgt aussehen:

# config/routes.rb 
resources :books do 
    get :add_to_books_i_read, on: :member 
end 

# app/controller/books_controller.rb 
def add_to_books_i_read 
    current_user.books << Book.find(params[:id]) 
    # redirect or other logic 
end 

# app/views/books/index.html.haml 
ul 
    - books.each do |book| 
    li 
     = link_to "#{book.name}", book_path(book) 
     = link_to "Add to my books", add_to_books_i_read_book_path(book) 
+0

Nun, ich habe all das gemacht, aber jetzt gibt es einen Fehler, wenn ich auf/books page: undefined Methode' add_to_books_i_read_book_path 'für # <# : 0x00000006f85678> aber es existiert in Routen Datei, wie Sie empfohlen haben. Wenn ich Routen hake sagt es /books/:book_id/add_to_books_i_read(.forma t) Es sieht verdächtig aus, denn in allen anderen Aktionen ist es nur Bücher /: id nicht books /: book_id Was denkst du? – Jakov

+0

Hmm .. Ich habe den Code mit 'get: add_to_books_i_read, on:: member' aktualisiert. Kannst du es noch einmal versuchen? –

1

finden Sie Ihre Routen wie (Anmerkung Mitglied zu organisieren Abschnitt)

resources :books do 
    member do 
    get :add_to_books_i_read 
    end 
end 

und siehe Präfix Verb Spalte in Rake Routen ausgegeben.

1

Von @Ioannis Tziligkakis, habe ich ein wenig bearbeitet.

Versuchen:

# config/routes.rb 
resources :books do 
    member do 
    get :add_to_books_i_read 
    end 
end 

# app/controller/books_controller.rb 
def add_to_books_i_read 
    current_user.books << Book.find(params[:id]) 
    # redirect or other logic 
end 

# app/views/books/index.html.haml 
ul 
    - books.each do |book| 
    li 
     = link_to "#{book.name}", book_path(book) 
     = link_to "Add to my books", add_to_books_i_read_book_path(book.id) 
+0

Ein Fehler tritt auf - Vorlage fehlt. Ich lese, dass es passieren könnte, weil Aktion erstellen, aber ich bekomme nicht, wo ich es nenne ( – Jakov

1

Versuchen Sie folgendes:

# config/routes.rb 
resources :books do 
    # just not about method: 
    # use get for request, search 
    # use put for update 
    # use post for create 
    # use delete for destroy 
    put :add_to_books_i_read, on: :member 
end 

# app/controller/books_controller.rb 
def add_to_books_i_read 
    @book = Book.find(params[:id]) 
    current_user.books << @book 
    respond_to do |format| 
    format.js 
    end 
end 

# app/views/books/index.html.haml 
ul 
    - books.each do |book| 
    li{:id => "book_#{book.id}"} 
     = render "links", book: book 

# add field: app/views/books/_links.html.haml 
= link_to "#{book.name}", book_path(book) 
= link_to "Add to my books", add_to_books_i_read_book_path(book), method: :put, remote: true 

# add field: app/views/books/add_to_books_i_read.js.erb 
$("#book_<%= @book.id %>").html("<%= j render 'books/links', book: @book %>") 
+0

Ein Fehler tritt auf - Vorlage fehlt. Ich lese, dass es passieren könnte wegen der Aktion erstellen, aber ich bekomme nicht wo kann ich es nennen ( – Jakov

+0

Ich weiß, was passiert ist. Willst du es mit Ajax tun oder nicht. Ich kann dir helfen @Jakov. – thanhnha1103

+0

Ich habe gerade die Antwort aktualisiert. Hoffe, diese Arbeit für Sie @Jakov: D – thanhnha1103

Verwandte Themen