2016-04-21 2 views
1

Je souhaite que mon application ajoute un livre à current_user lorsqu'il clique sur le lien. Mon code semble être correct, il n'y a pas d'erreur mais après que l'utilisateur clique sur le lien rien ne se passe.Comment appeler une méthode du contrôleur en utilisant link_to?

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 

À mon avis index Je

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} 

Alors, qu'est-ce que je fais mal? Pourquoi ma méthode add_to_books_i_read ne fait rien? La table de la base de données book_users n'enregistre rien après avoir cliqué sur ce link_to, mais elle fonctionne bien elle-même (j'ai vérifié via la console). Que puis-je faire? Comment rendre les utilisateurs ajoutent des livres à travers la méthode et comment appeler cette méthode correctement? Toute aide serait appréciée, merci!

Répondre

0

Oh mon Dieu. Avec votre aide, je l'ai enfin compris!Ainsi,

Controller:

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

Itinéraires

resources :books do 
    member do 
     get :add_to_books_i_read 
    end 
end 

vue index

-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) 

Merci à tous pour votre aide! Je suis vraiment très reconnaissant! :)

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

Oui, j'ai déjà essayé, mais il ne fait toujours rien ( – Jakov

+0

pouvez-vous vérifier dans les journaux si cette action est appelée? –

+0

Oui, ça va avec admin Et oui, il est appelé – Jakov

1

La première, method dans le link_to est le symbol of HTTP verb vous ne pouvez donc pas passer votre fonction dans le contrôleur Pour définir et utiliser une nouvelle action sur vous contrôleur, vous devez définir la route pour que see here

1

Depuis add_to_books_i_read est une méthode d'action de contrôleur que vous devez mettre à jour vos itinéraires pour inclure cette action pour les ressources books afin de bien jouer avec Rails de façon pratique. Vous obtenez également d'utiliser une aide d'URL de ce chemin qui ressemblera à ceci:

/books/:id/add_to_books_i_read

Votre code pourrait ressembler à ceci:

# 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

Eh bien, j'ai fait tout cela, mais maintenant il y a une erreur quand je suis sur la page/livres: méthode indéfinie 'add_to_books_i_read_book_path 'pour # <# : 0x00000006f85678> mais il existe dans les routes file: Lorsque je fais des routes, il est indiqué /books/:book_id/add_to_books_i_read(.:forma t) Il semble suspect parce que dans toutes les autres actions c'est juste des livres /: id pas de livres /: book_id Que pensez-vous? – Jakov

+0

Hmm .. J'ai mis à jour le code avec 'get: add_to_books_i_read, sur:: member'. Pourrais-tu lui donner un autre coup? –

1

Essayez également d'organiser vos itinéraires en (membre de la note section)

resources :books do 
    member do 
    get :add_to_books_i_read 
    end 
end 

et voir colonne de préfixe de verbe dans la production des itinéraires de râteau.

1

De @Iannis Tziligkakis, j'ai édité un peu.

Essayez:

# 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

Une erreur se produit - Modèle manquant. J'ai lu que cela pouvait arriver à cause d'une action de création, mais je n'arrive pas où je l'appelle ( – Jakov

1

Essayez ceci:

# 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

Une erreur se produit - Le gabarit est manquant. J'ai lu que cela pouvait arriver à cause de créer une action, mais je ne comprends pas où est-ce que je l'appelle ( – Jakov

+0

) Je sais ce qui s'est passé Voulez-vous le faire avec ajax ou non Je peux vous aider @Jakov – thanhnha1103

+0

Je viens de mettre à jour la réponse J'espère que ce travail pour vous @Jakov: D – thanhnha1103