不确定关联是否在我的rails应用程序中有效

时间:2015-12-24 19:46:32

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

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

用户模型:

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

2 个答案:

答案 0 :(得分:0)

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

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

在rails控制台中

ap Link.all.map(&:user)

如果他们确实由用户拥有

<%= @link.user.email %>

应打印出电子邮件。

您应该可以在控制器中执行以下操作:

@user.links << params[:new_link]

确保有很多工作。

答案 1 :(得分:0)

你正在使用装饰。在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