在我的应用程序中,我有三个模型: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路线,然后我将其重定向回来,以便在酒吧页面上显示新的微博。我该如何解决/改善这种情况?
感谢您的帮助!
答案 0 :(得分:1)
以下是基于给定信息的一种解决方案:
Rails.application.routes.draw do
resources :micropost
resources :pub do
resources :micropost
end
end
<%= form_for([@pub, @micropost]) do |f| %>
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 resources和Rails shallow nested routes。如有疑问,请进入终端并输入rake routes
以查看公开的路线类型。