【问题标题】:How to set a like button in rails如何在rails中设置一个like按钮
【发布时间】:2017-05-05 17:10:41
【问题描述】:

您好,我有一个锻炼应用程序,用户应该可以在其中喜欢某些产品。 我可以找到一种方法来展示他喜欢的产品,但我真的不知道如何创建 like 按钮。 我没有使用任何 gem,我不知道如何从头开始。

这是我的模型:

class User < ApplicationRecord
  has_many :likes
  has_many :liked_products, through: :likes, source: :product
end

class Product < ApplicationRecord
  has_many :likes
end

class Like < ApplicationRecord
  belongs_to :user
  belongs_to :product
end

在我的视图产品中显示我想要喜欢按钮的位置:

<h1><%= @product.name %></h1>

<%= link_to "Like", product_likes_path(@product), method: :put, remote: true %>

我的路线:

Rails.application.routes.draw do
  root to: 'visitors#index'
  devise_for :users
  resources :users

  resources :products do
    resource :likes
  end
end

那是我的产品控制器,我认为这里必须有东西,但我不知道如何!

class ProductsController < ApplicationController

  before_action :find_product, only: :show

  def index
    @products = Product.all
  end

  def show
    #@product.like  => gives an error 404
  end

  private

  def find_product
    @product = Product.find(params[:id])
  end
end

我创建了一个点赞控制器,但它似乎没有用......所以......我放弃了......

class LikesController < ApplicationController

  def new
    @like = Like.new(like_params)
  end

  def create
    @like = Like.new(like_params)
  end

  private

  def like_params
    params.require(:likes).permit(:user_id, :product_id)
  end

end

我真的很想了解一下这个问题:)

【问题讨论】:

    标签: ruby-on-rails ruby ajax ruby-on-rails-5


    【解决方案1】:

    终于知道怎么设置控制器了

    class LikesController < ApplicationController
    
      def create
        @user = current_user.id
        @product = params[:product_id]
        likes = {user_id: @user, product_id: @product}
        @like = Like.new(likes)
    
        @like.save!
        if @like.save
          redirect_to user_path(@user)
        else
         redirect_to product_path
        end
      end
    
    
    end
    

    按钮

    <%= link_to "Like", product_likes_path(@product), method: :post %>
    

    路线

    Rails.application.routes.draw do
        root to: 'products#index'
        devise_for :users
    
        resources :users
    
        resources :users do
          resources :products do
            resources :likes
          end
        end
      end
    

    【讨论】:

      【解决方案2】:

      您可以尝试以下方法:

      路线:

        Rails.application.routes.draw do
          root to: 'visitors#index'
          devise_for :users
      
          resources :users do 
            resources :products do 
              resources :likes
            end
          end
      
          resources :products do
            resource :likes
          end
        end
      

      这会给你类似的东西:

        ... other routes ...
      
            user_product_likes GET    /users/:user_id/products/:product_id/likes(.:format)           likes#index
                               POST   /users/:user_id/products/:product_id/likes(.:format)           likes#create
         new_user_product_like GET    /users/:user_id/products/:product_id/likes/new(.:format)       likes#new
        edit_user_product_like GET    /users/:user_id/products/:product_id/likes/:id/edit(.:format)  likes#edit
             user_product_like GET    /users/:user_id/products/:product_id/likes/:id(.:format)       likes#show
                               PATCH  /users/:user_id/products/:product_id/likes/:id(.:format)       likes#update
                               PUT    /users/:user_id/products/:product_id/likes/:id(.:format)       likes#update
                               DELETE /users/:user_id/products/:product_id/likes/:id(.:format)       likes#destroy
      
        ... other routes ...
      

      然后:

        <%= link_to "Like", user_product_likes_path(@user, @product), method: :post, remote: true %>
      

      在你的 LikesController 中:

        class LikesController < ApplicationController
      
          def new
            @like = Like.new(like_params)
          end
      
          def create
            @like = Like.new(like_params)
            if @like.save
              ... do something happy
            else
              ... do something sad
            end
          end
      
          private
      
          def like_params
            params.require(:likes).permit(:user_id, :product_id)
          end
      
        end
      

      未经测试,所以买家要小心。你可能需要摆弄你的 like_params 和其他东西。

      【讨论】:

      • 当然可以,很高兴为您提供帮助。如果您愿意,请接受。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 2010-11-14
      • 2014-08-03
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      相关资源
      最近更新 更多