我刚刚完成了Ruby on Rails 3教程。最后一章非常复杂。本书中的教程基本上创建了一个用户可以发布Microposts的站点。此外,每个用户都可以关注任何其他用户,然后以下用户的Microposts将显示在原始用户的Micropost源上。
我的问题与为什么RelationshipsController中的create动作让params变量包含一个二维数组有关。
这是代码。
用户
class User < ActiveRecord::Base
attr_accessible :email, :name, :password, :password_confirmation
has_secure_password
has_many :microposts, dependent: :destroy
has_many :relationships, foreign_key: "follower_id", dependent: :destroy
has_many :followed_users, through: :relationships, source: :followed
has_many :reverse_relationships, foreign_key: "followed_id",
class_name: "Relationship", dependent: :destroy
has_many :followers, through: :reverse_relationships, source: :follower
end
微柱
class Micropost < ActiveRecord::Base
attr_accessible :content
belongs_to :user
end
关系
class Relationship < ActiveRecord::Base
attr_accessible :followed_id
belongs_to :follower, class_name: "User"
belongs_to :followed, class_name: "User"
end
我认为这是创建二维参数变量的代码(但为什么?)
<%= form_for(current_user.relationships.build(followed_id: @user.id), remote: true) do
|f| %>
<div><%= f.hidden_field :followed_id %></div>
<%= f.submit "Follow", class: "btn btn-large btn-primary" %>
<% end %>
RelationshipsController
class RelationshipsController < ApplicationController
def create
@user = User.find(params[:relationship][:followed_id])
current_user.follow!(@user)
respond_to do |format|
format.html { redirect_to @user }
format.js
end
end
end
所以也许我只回答了我自己的问题,但我从未见过一个params变量的二维数组。有人可能会对此有所了解吗?
哦,也许我应该发布我的routes.rb文件:SampleApp::Application.routes.draw do
resources :users do
member do
get :following, :followers
end
end
resources :sessions, only: [:new, :create, :destroy]
resources :microposts, only: [:create, :destroy]
resources :relationships, only: [:create, :destroy]
root to: 'static_pages#home'
end
感谢, 麦克
答案 0 :(得分:3)
简答:
这不是一个二维数组,它是一个嵌套的关联数组。你使用它的原因是为了到达你真正想要的领域。
Long Aswer:
教程假设:当用户点击关注按钮时,目标是致电current_user.follow!(other_user)
。我将向您介绍代码如何实现这一目标。所有的魔法都在关系控制器和视图中的form_for函数中。
首先,您为新关系制作表格。因为它是嵌套资源,所以您可以通过关联来构建它。
current_user.relationships.build
但是一个全新的关系对象只对应一个用户并不意味着什么。相反,传入一个关联的值数组来初始化对象。在这种情况下,其他用户的ID。因此,您将要构建的Relationship对象的:followed_id属性分配给@ user.id,或者您要跟踪的用户。
current_user.relationships.build(followed_id: @user.id)
当您在对象上使用form_for时,可以访问该对象的属性。在这种情况下,如果我们查看关系模型,则只能访问:follow_id。
class Relationship < ActiveRecord::Base
attr_accessible :followed_id
最后,我们需要在表单提交中捕获followed_id,因为表单的目标是在单击跟随按钮时能够调用current_user.follow!(other_user)
。因此我们将followed_id作为隐藏字段传递,以便可以在控制器中的params
中访问它,但用户也不会在视图本身中看到它。
<%= f.hidden_field :followed_id %>
最后,当单击该按钮时,由于该表单用于新的Relationship对象,因此将为Relationship控制器调用create操作。在那里,要访问与表单对应的关系对象,您可以使用与教程中其他表单相同的方式 -
params[:relationship]
但是你不想要关系对象,你想要关注对象的用户对象,这样你就可以调用follow!
。这很简单。只需从id中找到数据库中的用户即可。如何获得followed_id?它是表单中Relationship对象的一个属性。
params[:relationship][:followed_id]
我认为值得注意的是,当你创建一个新的用户对象时,你使用params [:user]。这只是一个关联数组,如果你想要
,你可以访问它的字段params[:user][:name]
希望这是有道理的。它只是一个嵌套的关联数组,Rails用于跟踪参数,例如提交表单的参数。