您好我有一个运动应用程序,用户应该能够喜欢某些产品。 我可以找到一种方法来展示他喜欢的产品,但我真的无法想象如何创建和工作 like button 。 我没有使用任何宝石,我不想从Scratch了解如何做到这一点。
以下是我的模特:
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
我真的很喜欢这个... :)
答案 0 :(得分:2)
终于找到了如何设置控制器
// start cam
void Start () {
devices = WebCamTexture.devices;
background = GetComponent<RawImage> ();
devCam = new WebCamTexture ();
background.texture = devCam;
devCam.deviceName = devices [0].name;
devCam.Play ();
}
void OnGUI()
{
GUI.skin = skin;
//swap front and back camera
if (GUI.Button (new Rect ((Screen.width / 2) - 1200, Screen.height - 650, 250, 250),"", GUI.skin.GetStyle("btn1"))) {
devCam.Stop();
devCam.deviceName = (devCam.deviceName == devices[0].name) ? devices[1].name : devices[0].name;
devCam.Play();
}
//snap picture
if (GUI.Button (new Rect ((Screen.width / 2) - 1200, Screen.height - 350, 250, 250), "", GUI.skin.GetStyle ("btn2"))) {
OnSelectCapture ();
//freeze cam here?
}
}
public void OnSelectCapture()
{
imgID++;
string fileName = imgID.ToString () + ".png";
Texture2D snap = new Texture2D (devCam.width, devCam.height);
Color[] c;
c = devCam.GetPixels ();
snap.SetPixels (c);
snap.Apply ();
// Save created Texture2D (snap) into disk as .png
System.IO.File.WriteAllBytes (Application.persistentDataPath +"/"+ fileName, snap.EncodeToPNG ());
}
buttton
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 %>
答案 1 :(得分:1)
你可以尝试这些方法:
路线:
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和其他东西。