首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从获取id

如何从获取id
EN

Stack Overflow用户
提问于 2017-05-03 21:58:37
回答 1查看 1.1K关注 0票数 1

在我的应用程序中,我有三个模型:用户、酒吧和微博。

我希望当用户在发布页面上创建微博时,用用户id和pub id将micropost对象的记录保存在db中。要做到这一点,在微博表,我有user_id和pub_id。

问题是:用户必须在显示发布信息的页面上创建微博。我希望在用户按下按钮后,页面被刷新并显示新的微博。我不知道如何从URL中获取pub的id并将其传递给micropost控制器中的create方法,因此也要用pub_id创建新的微博。我可以从user_id变量中获得current_user。当用户创建微博时,URL会更改为/microposts,而id却找不到,所以我的问题可能是如何从previus中保存id,所以当用户创建微博时,它会被保存在发布的id中。

micropost.rb

代码语言:javascript
复制
class Micropost < ApplicationRecord
  belongs_to :user
  belongs_to :pub 
  default_scope -> { order(created_at: :desc) }
  validates :user_id, presence: true
  validates :content, presence: true, length: { maximum: 240 }
  validates :pub_id, presence: 
end

micropost_controller.rb

代码语言:javascript
复制
class MicropostsController < ApplicationController
    before_action :logged_in_user, only: [:create, :destroy]

def create
    @pub = Pub.find(params[:id]) // @pub gets nil value
    @micropost = current_user.microposts.create!(micropost_params)
    @micropost.pub= @pub // not sure about that
if @micropost.save
    flash[:success] = "Micropost created!"
    redirect_to(:back)
else
    render 'static_pages/home'
end
end

def destroy
end

private

def micropost_params
  params.require(:micropost).permit(:content, :pub_id)
end

end

_micropost_form.html.erb

代码语言:javascript
复制
<%= form_for(@micropost) do |f| %>
   <%= render 'shared/error_messages', object: f.object %>
   <div class="field">
     <%= f.text_area :content, placeholder: "Compose new micropost..." %>
   </div>
   <%= f.submit "Post", class: "btn btn-primary" %>
<% end %>

pub.rb

代码语言:javascript
复制
class Pub < ApplicationRecord
  belongs_to :user
  has_many :microposts, dependent: :destroy
  validates :user_id, presence: true
  validates :address, presence: true, length: {maximum: 140, minimum: 20}
  validates :name, presence: true, length: {maximum: 30, minimum: 5}
end

因此,我的主要问题是我无法构建新的微博,因为我无法从微博控制器访问@pub变量。当用户按下按钮时,它会到达/microposts路由,但是我会将它重定向回来,以便向我展示酒吧页面上的新微博。我怎样才能解决/改善这种情况?

谢谢你的帮忙!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-03 23:49:24

以下是基于给定信息的一种解决方案:

routes.rb

代码语言:javascript
复制
Rails.application.routes.draw do
  resources :micropost
  resources :pub do
    resources :micropost
  end
end

_micropost_form.html.erb

代码语言:javascript
复制
<%= form_for([@pub, @micropost]) do |f| %>

microposts_controller.rb

代码语言:javascript
复制
class MicropostsController < ApplicationController
  def create
    @pub = Pub.find(params[:pub_id]) 
    input = micropost_params.merge(pub: @pub)
    @micropost = current_user.microposts.build(input)
    if @micropost.save
        redirect_to :back, success: "Micropost created!"
    else
        render 'static_pages/home'
    end
  end
end

通过嵌套路由,您将确保URL中有一个pub_id。您可以使用它找到这个新的Pub将属于的Micropost。在MicropostsController中,您将使用params[:pub_id]查找Pub,为current_user构建一个Micropost,同时添加正确的pub_id

对于表单,您必须使用类似于此[@pub, @micropost]的数组,除非您决定使用浅路由在此解释。数组form_for版本在此页上解释,就在设置此链接所指向的方法标头的上方。

另外,请看一下Rails嵌套资源Rails浅嵌套路由。如果有疑问,请进入终端并键入rake routes以查看公开的路由类型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43770683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档