【问题标题】:Rails 3: alias_method_chain to set specific attribute firstRails 3:a​​lias_method_chain 先设置特定属性
【发布时间】:2011-07-15 00:00:47
【问题描述】:

当用户创建帖子时,我想先设置 user_id 属性。我正在尝试在 arrtibutes 方法上使用 alias_method_chain 来做到这一点。但我不确定这是否正确,因为我认为可以解决的问题仍在发生。这个对吗?

编辑:

当我的用户创建帖子时,他们使用名为“artist_tokens”的虚拟属性将“艺术家”分配给每个帖子。我将关系存储在一个艺术家模型和一个名为 artisanships 的艺术家 ID 和 post_id 的连接表中。

我还想存储创建属于他们帖子的艺术家的用户 ID(我希望它在艺术家模型本身中),所以我在艺术家模型上有一个 user_id 列。

问题是当我为每个帖子创建艺术家并尝试插入帖子创建者的 user_id 时,user_id 一直显示为 NULL。这很可能是因为帖子的 user_id 属性尚未设置。

我想解决这个问题,我需要先设置帖子的 user_id 属性,然后让其余属性照常设置。这是我找到 alias_method_chain 的地方。

post.rb

 attr_reader :artist_tokens

  def artist_tokens=(ids)
    ids.gsub!(/CREATE_(.+?)_END/) do
      Artist.create!(:name => $1, :user_id => self.user_id).id
    end
    self.artist_ids = ids.split(",")
  end


    def attributes_with_user_id_first=(attributes = {})
      if attributes.include?(:user_id)
        self.user_id = attributes.delete(:user_id)
      end
      self.attributes_without_user_id_first = attributes
    end
    alias_method_chain :attributes=, :user_id_first

编辑:

class ArtistsController < ApplicationController

  def index
    @artists = Artist.where("name like ?", "%#{params[:q]}%")
    results = @artists.map(&:attributes)
    results << {:name => "Add: #{params[:q]}", :id => "CREATE_#{params[:q]}_END"}

    respond_to do |format|
      format.html
      format.json { render :json => results }
    end
  end

【问题讨论】:

  • 这似乎不合适。你到底想做什么? user.posts.build 之类的东西?
  • 已编辑以显示有关我正在尝试做的事情的更多信息。

标签: ruby-on-rails ruby-on-rails-3 methods


【解决方案1】:

在您的控制器中,为什么不这样做:

def create
  @post = Post.new :user_id => params[:post][:user_id]
  @post.update_attributes params[:post]
  ...
end

但在我看来,在您对帖子进行验证后创建艺术家记录会比您第一次分配属性时要好得多。

编辑

我会把它改成这样的回调:

class Post < ActiveRecord::Base
  attr_accessor :author_tokens
  def artist_tokens=(tokens)
    @artist_tokens = tokens.split(',')
  end

  after_save :create_artists
  def create_artists
    @artist_tokens.each do |token|
      ...
    end
  end
end

【讨论】:

  • 如何与@post = user.posts.build(params[:post]) 完全配合?
  • 之后创建艺术家,回调会是什么样子?我很困惑如何获取艺术家令牌数据,请记住,有时艺术家需要创建,有时它已经存在于数据库中。我已在上面的艺术家控制器中添加,因此您可以看到我如何使用来自艺术家令牌的 ID,它是来自 railscast #258 的增强 jquery 令牌输入设置,允许创建新令牌
  • 感谢您的帮助,但我意识到,因为我有一个艺术家 ID 和 post_id 的连接表,当我创建一个帖子时我需要艺术家的 ID,这就是我在艺术家令牌中创建它的原因方法并将 .id 添加到 Artist.create!() 的末尾,并使用它来设置帖子的 self.artist_id。您如何看待增加的动态?
  • 在这种情况下,您希望将回调从after_save 切换到before_save
猜你喜欢
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多