【问题标题】:Unsure if association is working in my rails app不确定关联是否在我的 rails 应用程序中有效
【发布时间】:2015-12-24 19:46:31
【问题描述】:

我的应用有用户,用户可以发布指向我的应用的链接。我设置了一个关联,以便用户 has many :links 和链接 belong_to 用户(请参阅下面的模型)。现在我正试图让用户的电子邮件出现在显示模板中,并且我为 Link.user 获得了新链接的 nil 值。有人可以解释为什么吗?我的关联不正确吗?发布链接时用户已登录。

用户模型:

class User < ActiveRecord::Base
    has_many :links
    acts_as_voter
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

end

链接模型:

class Link < ActiveRecord::Base
    belongs_to :user

    acts_as_votable

    attr_accessor :avatar
    mount_uploader :avatar, AvatarUploader
end

show.html.erb:

<%= time_ago_in_words(@link.created_at) %> by <%= @link.user.try(:email) %>

架构:

  create_table "links", force: :cascade do |t|
    t.string   "title"
    t.string   "url"
    t.datetime "created_at",                     null: false
    t.datetime "updated_at",                     null: false
    t.integer  "user_id"
  end

create_table "users", force: :cascade do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at",                          null: false
    t.datetime "updated_at",                          null: false
  end

在链接控制器中创建链接;

  def new
    @link = Link.new
  end

  def create
    @link = Link.new(link_params)

    if @link.save
      redirect_to root_path
    else
      render 'new'
    end
  end

  private
    def link_params
      params.require(:link).permit(:title, :url, :avatar)
    end

【问题讨论】:

  • userslinks 表的外观如何?链接表中是否有 user_id 列?
  • 我为链接和用户发布了我的架构。是的,链接表中有一个用户 ID @archana
  • 一定要使用控制台检查关联,以确保正确创建记录。请参阅下面的答案。
  • 请同时向我们展示Link创建的代码。
  • 我刚刚添加了用于创建链接的控制器操作@JohannesThorn

标签: ruby-on-rails ruby-on-rails-4 associations


【解决方案1】:

确保链接在创建时实际分配给用户。

使用 rails 控制台。尝试遍历链接并确保它们具有 user_ids:

在 Rails 控制台中:

ap Link.all.map(&:user)

如果它们确实归用户所有

<%= @link.user.email %>

应该打印出电子邮件。

你应该能够在你的控制器中做这样的事情:

@user.links << params[:new_link]

确保大部分工作正常。

【讨论】:

    【解决方案2】:

    您正在使用设计。在您的 Link 控制器中,您必须验证您的登录用户。

    # app/controllers/links_controller.rb
      before_action :authenticate_user!
    
      def create
        @link = current_user.links.new(link_params)
        if @link.save
          redirect_to root_path
        else
          render 'new'  # generally this is a render 'edit'
        end
      end
    

    我在这里截断了文件。请阅读devise manual

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多