在我的应用程序中,我有三个模型:用户、酒吧和微博。
我希望当用户在发布页面上创建微博时,用用户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
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:
endmicropost_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路由,但是我会将它重定向回来,以便向我展示酒吧页面上的新微博。我怎样才能解决/改善这种情况?
谢谢你的帮忙!
发布于 2017-05-03 23:49:24
以下是基于给定信息的一种解决方案:
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,为current_user构建一个Micropost,同时添加正确的pub_id。
对于表单,您必须使用类似于此[@pub, @micropost]的数组,除非您决定使用浅路由在此解释。数组form_for版本在此页上解释,就在设置此链接所指向的方法标头的上方。
另外,请看一下Rails嵌套资源和Rails浅嵌套路由。如果有疑问,请进入终端并键入rake routes以查看公开的路由类型。
https://stackoverflow.com/questions/43770683
复制相似问题