ActiveRecord关联仅在控制台中工作



我有一个User模型和一个ArtworkIteration模型。用户可以创建ArtworkIterations。

我的用户模型有许多艺术重复

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_many :artwork_iterations
end

我的艺术作品_重复下面的内容_给用户

class ArtworkIteration < ActiveRecord::Base
  belongs_to :user
end

以下是将user_id外键添加到我的artwork_iteration模型的迁移

class AddUserIdToArtworkIterations < ActiveRecord::Migration
  def change
    add_column :artwork_iterations, :user_id, :integer
    add_index :artwork_iterations, :user_id
  end
end

当我在rails控制台中创建artwork_iteration时,它起作用:

> @art = ArtworkIteration.create(user_id: User.last.id)
> @art.user
# Successfully returns the last user

但是,当我登录时通过我的网站创建artwork_iteration时,artwork_interation.user为null。

为了解决这个问题,我在表格中添加了一个隐藏字段:

<%= f.hidden_field :user_id, value: "#{current_user.id}" %>

但这似乎很不礼貌,而且极不安全。(任何用户都可以检查元素并更改此值,从而允许他们以不同用户的身份创建artwork_iterions)。

您可能知道答案,但没有意识到。我们很可能需要查看您的控制器和路由,但在控制台中,您可以清楚地分配user_id。在你的网站上,你显然不是。如果您在路由中的user下嵌套了artwork_iterions,则必须在控制器中有一个用于新建和创建的东西,如果没有,则必须有另一个。

如果您是嵌套的,那么在artwork_iterations控制器的顶部,您需要以下before_action:

before_action :get_user

然后在底部你需要这个作为一个私人方法:

def get_user
  @user = User.find(params[:user_id]) # (or current_user as you seem to have that helper)
end

这将传递localhost/user/1/artworkiterations/new页面的参数,以便用户与登录的用户匹配。如果你有Devise或"current_user"方法,你可以在这里使用current_user。

我假设您已经嵌套了它,但无论哪种方式,您都必须声明新用户的身份,并在artwork_iterations控制器中创建操作。这样:

def new
  @artworkiteration = @user.artwork_iterations.build
end

这样的东西可能对你有用。

相关内容

最新更新