二维数组作为参数值

时间:2012-07-16 16:53:13

标签: ruby-on-rails-3 railstutorial.org

我刚刚完成了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

感谢, 麦克

1 个答案:

答案 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用于跟踪参数,例如提交表单的参数。