是否可以在控制器的create动作中引用id属性?

时间:2014-05-09 17:45:53

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

我正在使用bit.ly api并尝试设置我的控制器创建操作,以便我只能使用api一次,然后将缩短的链接存储在@micropost.link中以这种方式在我的观点中引用它。

microposts_conroller.rb

def create
    @micropost = current_user.microposts.build(micropost_params)
    client = Bitly.client
    url = client.shorten("https://www.myapp.com/microposts/#{@micropost.id}")
    @micropost.link = url.short_url

    respond_to do |format|
      if @micropost.save
        format.html {redirect_to root_url}
        format.js
      else
        @feed_items = []
        @microposts = []
        render 'static_pages/home'
      end
    end
end

是否可以在创建动作中引用新创建的微博的id属性?
#{@micropost.id}工作不起作用,我尝试了其他一些事情,但没有运气。我应该以不同的方式接近这个吗?

3 个答案:

答案 0 :(得分:3)

假设您正在使用SQL数据库引擎,@micropost在您保存之前不会有ID。很可能你需要两次保存新创建的模型实例,一次获得一个id,然后第二次保存“link”属性。

答案 1 :(得分:2)

您使用的.build仅构建模型,但不保存模型。

保存模型将设置ID。因此,您只能在保存模型后构建URL。

如果保存后未设置id,则会出现验证错误。

所以你的代码看起来像这样:

def create
  @micropost = current_user.microposts.build(micropost_params)

  if @micropost.save
    url = Bitly.client.shorten(micropost_url(@micropost)) 
    @micropost.update_attributes link: url.short_url

    respond_to do |format|
      format.html {redirect_to root_url}
      format.js
    end
  else
    @feed_items = []
    @microposts = []
    render 'static_pages/home'
  end
end

我使用update_attributes来更新数据库中的参数,这样更清晰,然后设置链接并再次保存。

答案 2 :(得分:1)

试试这个

def create
    @micropost = current_user.microposts.build(micropost_params)

    if @micropost.save #micropost is created

    client = Bitly.client
    #using the micropost id here below
    url = client.shorten("https://www.myapp.com/microposts/#{@micropost.id}") 
    @micropost.link = url.short_url

    respond_to do |format|

    format.html {redirect_to root_url}
    format.js
    end

    else

    @feed_items = []
    @microposts = []
    render 'static_pages/home'

  end
end