如何从URL Rails获取id

时间:2017-05-03 21:58:38

标签: ruby-on-rails

在我的应用程序中,我有三个模型:user,pub和micropost。

我希望当用户在pub页面上创建微博时,微博对象的记录将保存在带有用户ID和pub id的db中。 要在微博表中执行此操作,我有user_id和pub_id。

问题在于:用户必须在显示pub信息的页面上创建微博。我希望在用户按下按钮后,刷新页面并显示新的微博。我无法弄清楚如何从URL获取pub的id并将其传递给micropost控制器中的create方法,因此也可以使用pub_id创建新的micropost。我可以从current_user变量中获取user_id。当用户创建微博时,URL更改为/microposts并且找不到ID,因此我的问题可能是如何从previus URL保存id,因此当用户创建微博时,它会保存在酒吧的身份。

micropost.rb

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

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

<%= 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

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路线,然后我将其重定向回来,以便在酒吧页面上显示新的微博。我该如何解决/改善这种情况?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

的routes.rb

Rails.application.routes.draw do
  resources :micropost
  resources :pub do
    resources :micropost
  end
end

_micropost_form.html.erb

<%= form_for([@pub, @micropost]) do |f| %>

microposts_controller.rb

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,为Micropost构建current_user,同时添加正确的pub_id。< / p>

使用表单时,除非您决定使用浅路由explained here,否则必须使用此[@pub, @micropost]之类的数组。数组form_for版本在this page上方的设置方法标题上方解释了此链接带您到达。

另外,请查看Rails nested resourcesRails shallow nested routes。如有疑问,请进入终端并输入rake routes以查看公开的路线类型。