与没有 Ajax 或 jQuery on Rails 的情况类似/不同

2024-03-29

我正在尝试实现一个简单的类似/不同函数。我在这里看到的所有示例似乎都适用于 ajax 或 jquery。我还是一个初学者,我也不完全理解,我只想要一个简单的解决方案。

我的想法是,我有书,我有用户。用户可以喜欢书籍。所以我通过 Like 模型创建了一个多对多关联。 Like 模型有一个相应的数据库,其中包含 book_id 和 user_id 列。因此:

class Book < ActiveRecord::Base
  has_many :likes
  has_many :users, through: :likes

class User < ActiveRecord::Base 
  has_many :likes
  has_many :books, through: :likes

class Like < ActiveRecord::Base
  belongs_to :book
  belongs_to :user
end

不幸的是,这只是我的理解。我不知道如何利用这种关系来创建喜欢并将其与适当的书籍和用户相关联。

我的想法是,如果用户不喜欢这本书,则向他展示一个“喜欢”按钮;如果他不喜欢,则向他展示一个“喜欢”按钮。所以基本上,我想要这么简单的东西:

<%  if user likes? %>

<div class="unlike_button"><%= link_to "Unlike", '#' %></div>

<% else %>

<div class="like_button"><%= link_to "Like", '#' %></div>

<% end %>

我使用 # 存根,因为我不知道它应该使用什么路线。但无论解决方案是什么,我希望它能够重定向到同一页面,并带有一个 Flash 通知,显示“喜欢”或“不喜欢”。 我已经有了like_button 和unlike_button 类的div 背景图像,这就是为什么我将它们实现为上面的图像链接。

任何形式的指导或帮助,将不胜感激。谢谢

UPDATE

我正在遵循下面 Bennick 的指导,但我仍然停留在 Rails 控制台中。我认为如果我在控制台中遇到错误,那么继续下去就没有意义了。

按照建议,我在控制台中尝试了以下操作:

因为我已经有用户了user = User.find(1)and book = Book.find(1)

但在下一行like = Like.create(:user => user, :book => book)返回了批量分配错误。Can't mass-assign protected attributes: book, user我想这也许会有帮助attr_accessible :book_id, :user_id在类似的模型中,但我仍然遇到错误。我错过了什么吗?

SOLVED

我终于开始工作了!使用like = Like.create(:user => user.id, :book => book.id).


好的,这里有很多项目。我将带你上去stack (model -> 协会 -> 控制器 -> view -> router)。通常,当您设计 Web 应用程序时,您会从数据库层开始,然后逐步向上。所以我们将在这里这样做。

Model

您可以在此处决定需要哪些数据库对象并创建数据库表来表示它们。如果您还没有阅读 Rails 迁移指南:http://guides.rubyonrails.org/migrations.html http://guides.rubyonrails.org/migrations.html

对于您的情况,此设置是合适的:

class Book < ActiveRecord::Base
  attr_accessible :title

  has_many :likes
  has_many :users, through: :likes
end

class User < ActiveRecord::Base
  attr_accessible :name

  has_many :likes
  has_many :books, through: :likes
end

class Like < ActiveRecord::Base
  attr_accessible :book, :user

  belongs_to :book
  belongs_to :user
end

请注意,我们需要包括attr_accessible所以我们不会出现任何质量分配错误。请注意,在 Rails 4 中,此安全功能已移至控制器中。有关这方面的更多信息,请参阅这些或搜索互联网:http://blog.teamtreehouse.com/rails-4-strong-paremeters http://blog.teamtreehouse.com/rails-4-strong-paremeters http://weblog.rubyonrails.org/2012/3/21/strong-parameters/ http://weblog.rubyonrails.org/2012/3/21/strong-parameters/

协会

您应该阅读有关关联的 Rails 指南:http://guides.rubyonrails.org/association_basics.html http://guides.rubyonrails.org/association_basics.html

这将使您很好地了解数据库对象(Active Record 对象)如何相互交互。在你的问题中你已经设置了这些。一旦建立关联,Rails 就会提供许多用于访问它们的方法。下面是一个 Rails 控制台会话示例:rails c

# Create a user
user = User.create(:name => "Ryan") # I'm assuming User just requires a name for simplicity
  => #<User id: 1, name: "Ryan">
# Create two a books
book = Book.create(:title => "Game of Thrones")
  => #<Book id: 1, title: "Game of Thrones">
book2 = Book.create(:title => "The Well-Grounded Rubyist")
  => #<Book id: 2, title: "The Well-Grounded Rubyist">
# Create a two likes from the books and the user record
like = Like.create(:user => user, :book => book)
  => #<Like id: 1, user_id: 1, book_id: 1>
like2 = Like.create(:user => user, :book => book2)
  => #<Like id: 2, user_id: 1, book_id: 2>
# Notice how the keys glue the associations

# Query a user's likes
user.likes.count
  => 2
user.likes
  => #<ActiveRecord::Associations::CollectionProxy [#<Like id: 1, user_id: 1, book_id: 1>, #<Like id: 2, user_id: 1, book_id: 2>]
# Query a user's books
user.books
  => #<ActiveRecord::Associations::CollectionProxy [#<Book id: 1, title: "Game of Thrones">, #<Book id: 1, title: "The Well-Grounded Rubyist">]

如有疑问,请使用 Rails 控制台。你会从中学到很多东西。

控制器

为了使最终用户与数据库对象进行交互,需要控制器来促进交换。再次阅读相关的 Rails 指南:http://guides.rubyonrails.org/action_controller_overview.html http://guides.rubyonrails.org/action_controller_overview.html如果您现在还没有猜到,我强烈建议您阅读其中的大部分内容。

为了您的原因,我们正在创建类似的对象,因此让我们创建一个类似的控制器:

rails g controller likes index

这将创建带有索引操作和视图文件的控制器。

# app/controllers/likes_controller.rb
class LikesController < ApplicationController

  # This action will show our likes for a user.
  # Lets assume you have an authentication system (ex Devise) that logs a user in and provides a `current_user` object
  # GET /likes
  def index
    # Assign the logged in user to @user
    @user = current_user
    # Grab all of the books and put them into an array in @books
    @books = Book.all
  end

  # This is our key action. We will use this action to create a Like
  # POST /likes
  def create
    # Grab our book from the DB. Note that this syntax is for Rails 3.2 and below. Rails 4 uses something called Strong Parameters, but that is for another time. 
    book = Book.find(params[:book_id])
    # Create a like
    Like.create(:book => book, :user => current_user)
    # redirect back to the Like index page and assign a flash
    redirect_to likes_path, :notice => "You just liked the book #{book.title}" 
  end

  # here is where we will destroy a Like
  # DELETE /likes/:id
  def destroy
    # Get the like form the DB
    like = Like.find(params[:id])
    # destroy it
    like.destroy
    redirect_to likes_path, :notice => "You destroyed a like"
  end
end

Router

路由器将外部 http 请求连接到控制器操作。就您而言,您所需要的只是:

# config/routers.rb
 MyApp::Application.routes.draw do

  resources :likes

 end

这是一个 Rails 快捷方式,它设置了 7 条标准路由以及相关的帮助程序:

    likes GET    /likes(.:format)          likes#index
          POST   /likes(.:format)          likes#create
 new_like GET    /likes/new(.:format)      likes#new
edit_like GET    /likes/:id/edit(.:format) likes#edit
     like GET    /likes/:id(.:format)      likes#show
          PUT    /likes/:id(.:format)      likes#update
          DELETE /likes/:id(.:format)      likes#destroy

帮自己一个忙,阅读本指南:http://guides.rubyonrails.org/routing.html http://guides.rubyonrails.org/routing.html它将解释这些路线是什么以及它们如何工作。 Rails 遵循 REST,就像大多数现代 Web 开发世界一样。

View

在您看来,您将需要一个供用户交互的表单。此表单会将数据发送到应用程序,特别是您的 LikesController 操作。

# app/views/likes/index.html.erb

# show your flash messages
<% flash.each do |name, msg| %>
  <div class="alert <%= "alert-#{name}" %>">
    <%= msg %>
  </div>
<% end %>

<h1>Books you may or may not like</h1>
# For each book
<% @books.each do |book| %>
  <% unless @user.books.include?(book) %> # Prob want to move this into a User instance method
    # Create a like form if the user does not have a like for this book
    <%= form_tag likes_path do %>
      <%= hidden_field_tag 'book_id', book.id %>
      # Clicking this sends a request: POST /likes with params of: book_id=123
      <%= submit_tag "Like this book", :class => "like_button" %>
    <% end %>
  <% else %>
    # Find the like. I'll admit there is probably a better way to do this but it's getting past my bed time. 
    <% like = book.likes.where(:user_id => @user.id).first %>
    # Destroy the like associated with this book and user
    <div class="unlike_button">
      # Clicking this sends a request to: DELETE /likes/123
      <%= link_to "destroy like", likes_path(like.id), :method => :delete %>
    </div>
  <% end %>
<% end %>

结论

我希望这能给您一些指导。

将来尝试让您的问题更加具体,因为这个问题涵盖了很大的领域。我刚刚开始积极回馈社会,所以我可能做得有些过头了。刚开始时我收到了大量免费的指导和帮助。是时候回报我的恩情了。

慢慢来,当您遇到错误时,只需将其发布到 Google 即可。您可能最终会遇到 Stack Overflow 问题。

Cheers!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与没有 Ajax 或 jQuery on Rails 的情况类似/不同 的相关文章

  • 如何在 Rails 4 中使用 params.require

    我有一个像这样的私有方法 用于有四个字段的注册表单 firstname email password and confirm password 我不知道如何检查password confirmation def user params pa
  • 使用 jquery 事件 keydown 模拟在文本区域上输入不起作用

    我正在尝试制作 Facebook 自动回复消息脚本 这是我的代码 window load function var a setInterval function var e titlebarText html if e else texta
  • 使用 jQuery 更改 CSS 类属性

    有没有办法使用 jQuery 更改 CSS 类的属性 而不是元素属性 这是一个实际的例子 我有一个 div 类red red background red 我想转班级red背景属性 而不是具有类的元素red分配的背景 如果我用 jQuery
  • 如何从 ruby​​ 中的字符串名称创建类实例?

    我有一个类的名称 我想创建该类的一个实例 以便我可以循环该类的架构中存在的每个 Rails 属性 我该怎么做呢 我的名称是我想要检查的类的字符串 我想我需要实例化一个类实例 以便我可以 循环遍历它的属性并打印它们 在 Rails 中你可以这
  • 使用 jquery fullCalendar 时,为什么我在切换月份后看到重复的事件?

    I am 使用 jquery fullCalendar 插件 http arshaw com fullcalendar 我遇到了一个奇怪的问题 当我加载第一个月 在本例中为 2013 年 12 月 时 它工作正常 我调用我的 ajax 事件
  • Vue 2 日期选择器组件

    我正在尝试使用 Bootstrap Datepicker 创建 Vue 2 组件 但在选择日期后尝试更新输入时遇到困难 这是我的代码 Vue component datepicker template
  • jquery 小部件、_create 或 _init

    有些jquery插件扩展小部件使用 create方法 而另一些则使用 init方法 有人可以解释两者之间的区别吗 还有什么时候扩展 widget 或直接扩展 jquery fn 更好的指导 来自jQuery UI 开发人员指南 http d
  • Twitter 的推文按钮有回调吗?

    有没有办法在 Twitter 的推文按钮上注册回调 我希望能够跟踪我网站上的哪些特定用户在 Twitter 上发布了链接 我无法添加 onClick 事件 因为它是跨域 iFrame 还有其他想法吗 我见过一种方法 https stacko
  • Rails 5.1 CORS - 如何为不同环境设置不同来源

    我正在使用带有 Rail 5 1 API 的rack cors gem 根据文档 我有以下初始化程序 配置 初始化器 cors rb module Api Rails application config middleware insert
  • 仅删除多对多关系

    我有一个 has and belongs to many friends join table gt friends peoples 要添加朋友 我会这样做 people followers lt lt friend这会创建关系和新的个人资
  • 使用 VCR 过滤敏感数据

    我正在使用 VCR gem 记录 http 交互并在将来重播它们 我想过滤掉 uri 请求中的实际密码值 以下是 uri 的示例 http services somesite com Services asmx Cabins Usernam
  • 使用 jQuery 保留切换状态[重复]

    这个问题在这里已经有答案了 可能的重复 带 Cookie 的 jQuery 切换 https stackoverflow com questions 2523189 jquery toggle with cookie 我有一个简单的切换 但
  • Ruby on Rails:如何使用 TCP 套接字连接 GPS 设备

    ruby 2 3 0p0 2015 12 25 修订版 53290 x86 64 linux 轨道 4 2 4 我正在使用 cloud9 IDE 和 webrick 服务器 我的项目是实时跟踪GPS 我想使用TCP连接与GPS跟踪设备进行通
  • 为什么 RackMultipart* 文件保留在我的 Rails /tmp 目录中?

    我正在使用 Paperclip 2 3 来处理在 Ubuntu 上运行的 Rails 3 0 3 应用程序上的图像上传 Paperclip 正在按广告处理上传 但在应用程序的 tmp 文件夹中创建的 RackMultipart 文件仍然存在
  • jQuery 中什么函数相当于 .SelectMany()?

    让我解释一下 我们知道 jQuery 中的映射函数充当 Select 如 LINQ 中 tr map function return this children first returns 20 tds 现在的问题是我们如何在 jQuery
  • Angularjs : $locationProvider.hashPrefix("!") ;

    我想将网址显示为 www test com 因为我正在使用 locationProvider hashPrefix 但它显示网址为 www test com 我想 哈希之前而不是哈希之后 Thanks var app angular mod
  • 浏览器关闭时 Omniauth 会话过期

    在我的 Rails 3 应用程序中 我使用 Omniauth 进行用户身份验证部分 fb twitter 实际上我遵循这个 https github com RailsApps rails3 mongoid omniauth https g
  • Rails:named_scope、lambda 和块

    我认为以下两个是等效的 named scope admin lambda company id conditions gt company id company id named scope admin lambda do company
  • 意外的令牌:尝试解析 JSON 字符串时

    我正在尝试解析这个 JSON 字符串 RESULTS name Thessaloniki GR type Sailing l sailing weather beach Porto 20Carras 20Marina 45904 name
  • 如何为 jQuery 插件设置私有变量?

    我想创建一个简单的插件 它使用元素的文本作为默认值 或者您可以在调用插件时设置此值 但是 如果我不设置该值 并为多个元素调用插件 则默认值会成倍增加 function fn reText function options var setti

随机推荐

  • java8 中的多个 Null 检查处理

    我计划添加一些可读的代码 而不是在下面的情况下进行多个空检查 可能需要 java 8 流 映射的帮助 有人可以帮我解决这个问题吗 private String getRailsServiceClass IRailsComponent rai
  • 如何获取wcf应用程序的工作路径?

    我想要获取 WCF 应用程序的工作文件夹 我怎么才能得到它 If I try HttpContext Current Request MapPath HttpContext Current Request ApplicationPath 我
  • 添加项目时,Observablecollection 不更新列表

    我正在使用 MVVM 模式 并且想要使用可观察集合来更新 ListView 我经历了几个这样的问题 但看不出我做错了什么 任何帮助深表感谢 谢谢 视图 xaml 命名空间 xmlns local clr namespace MusicPla
  • 我们如何使用 try finally 来实现 Lock.lock 和 Lock.unlock

    考虑以下代码 为了阻止IndexOutOfBoundsException打电话时listIterator 我们使用读取器锁来检索基于索引的迭代器 并在其他地方使用写入器锁进行写入操作stockCodes 请注意 我们没有使用任何锁定机制来迭
  • Scala 宏:获取参数默认值

    我有下一个代码 我想从值中提取默认参数 def extractor T macro extractorImpl T def extractorImpl T c WeakTypeTag c Context first i got a type
  • 使用 goroutine 时 HTTP GET 请求的时间响应

    我有一个简单的代码 可以打印文本文件 url list txt 中列出的每个 URL 的 GET 响应时间 当请求按顺序触发时 返回的时间对应于各个 URL 的预期响应时间 然而 当同时执行相同的代码时 返回的响应时间通常比预期要长 看来开
  • 如何使用 CMake 和 Visual Studio 2010(64 位)构建 MATLAB R2011a(64 位)mex 文件?

    我想写一个CMakeLists txt这样 CMake 编写 Visual Studio 2010 64 位 解决方案文件 以从 C 代码为 MATLAB R2011a 64 位 构建 mex 函数example cxx 我不想使用 MAT
  • PHP MongoDB映射减少数据库断言失败

    我第一次使用 PHP MongoDB 进行 Map Reduce 运行 MapReduce 命令时遇到错误 My code map function emit this topic id re date this date posted r
  • 为什么我的代码没有返回任何内容

    目前对编程还很陌生 正在尝试学习Python 我有这段代码 但我不明白为什么我没有得到返回值 balance 3200 annualInterestRate 0 2 monthlyInterestRate annualInterestRat
  • 如何在perl中的本地范围内访问导入模块中的变量?

    我在创建 perl Moose 模块时陷入困境 我有一个全局 pm 模块 package XYZ require Exporter our ISA qw Exporter EDIT missed this line our EXPORT O
  • Django-MPTT,如何

    嘿 我刚刚安装了 django mptt 库 但我不知道如何让它工作 我已经添加了 from mptt models import MPTTModel class Category MPTTModel slug models SlugFie
  • 这些未定义的检查在行为上是否相同?

    我似乎有不同的方法 严格平等 检查undefined if something undefined if typeof something undefined if something void 0 可能还有其他人 In a 幸福的场景他们
  • Arduino:连接字符串时崩溃和错误

    我尝试将 AES 256 加密的输出连接到一个字符串 将此字符串与从 Android 手机发送的加密字符串进行比较 基本上 连接似乎有效 但在几次运行后会出现错误 不可读的字符 字符串变得更短而不是更长 或崩溃 它是可重现的 重启后在同一点
  • Youtube Iframe:未调用 onYouTubePlayerAPIReady()

    我有一个带有 iframe 的页面 它加载 youtube 视频 iframe 的 src 在运行时修改 我基于 Rob W 在该主题的不同答案中提供的代码 然后 当加载 iframe 时 执行以下代码 browser load funct
  • 每行的快速列洗牌 numpy

    我有一个包含行的长度超过 10 000 000 的大型数组 我需要单独洗牌这些行 例如 1 2 3 1 2 3 1 2 3 1 2 3 to 3 1 2 2 1 3 1 3 2 1 2 3 我目前正在使用 map numpy random
  • 在 UITextfield 中放置“清除按钮”

    有没有办法定位清除按钮 我想将其向下移动一点 使其与文本输入处于同一水平 有任何想法吗 我的文本字段已经是处理效果的另一个类的子类 包含 clearButtonRect 函数不起作用 IBDesignable open class Hosh
  • 有人可以解释一下这个 C# lambda 语法吗?

    我最近发现了一个静态方法 声明为 public class Foo public static Func
  • SQL Server 排序规则

    我正在读的书上说 SQL Server 支持两种字符数据类型 常规和 Unicode 常规数据类型包括 CHAR 和 VARCHAR Unicode 数据类型包括 NCHAR 和 NVARCHAR 不同之处在于 常规字符每个字符使用一个字节
  • Sinatra 是多线程的吗?

    Sinatra 是多线程的吗 我在其他地方读到 sinatra 默认情况下是多线程的 这意味着什么 考虑这个例子 get multithread do t1 Thread new puts sleeping for 10 sec sleep
  • 与没有 Ajax 或 jQuery on Rails 的情况类似/不同

    我正在尝试实现一个简单的类似 不同函数 我在这里看到的所有示例似乎都适用于 ajax 或 jquery 我还是一个初学者 我也不完全理解 我只想要一个简单的解决方案 我的想法是 我有书 我有用户 用户可以喜欢书籍 所以我通过 Like 模型