目前在我的Rails应用程序中,我有用户,样本和瓶子。
样本属于一个瓶子和提交它的用户。 瓶子不属于用户。
class Swatch < ActiveRecord::Base
mount_uploader :swatch, SwatchUploader
belongs_to :user
belongs_to :bottle
end
class Bottle < ActiveRecord::Base
has_many :swatches
end
class User < ActiveRecord::Base
has_many :swatches
end
目前,用户可以从瓶子的展示页面上传一个瓶子的新样本。
这是样本控制器:
class SwatchesController < ApplicationController
def create
@bottle = Bottle.find(params[:bottle_id])
@user = current_user
@swatch = @bottle.swatches.create(swatch_params)
redirect_to bottle_path(@bottle)
end
private
def swatch_params
params.require(:swatch).permit(:swatch, :user_id, :bottle_id)
end
end
HAML:
= form_for([@bottle, @bottle.swatches.build]) do |f|
= f.label :swatch
= f.file_field :swatch
= f.submit
通过此设置,除非我将当前用户的ID作为隐藏字段传递,否则表单将无法工作。但我知道这是不好的做法,并希望避免这种情况。
所以我的问题是:如何通过控制器传递bottle_id
和当前用户的user_id
?
答案 0 :(得分:7)
为什么需要通过表单传递current_user
?在您的控制器中,如果您想将user_id
设置为current_user
ID,请执行以下操作:
应用程序/模型/ swatch.rb
class Swatch < ActiveRecord::Base
mount_uploader :swatch, SwatchUploader
belongs_to :user
belongs_to :bottle
def set_user!(user)
self.user_id = user.id
self.save!
end
end
应用程序/控制器/ swatches_controller.rb
class SwatchesController < ApplicationController
def create
@bottle = Bottle.find(params[:bottle_id])
@user = current_user
@swatch = @bottle.swatches.new(swatch_params)
@swatch.set_user!(current_user)
redirect_to bottle_path(@bottle)
end
private
def swatch_params
params.require(:swatch).permit(:swatch, :bottle_id)
end
end
答案 1 :(得分:2)
你不能只为用户使用current_user吗?对于bottle_id,我想最好将瓶子放在地址中,因为你正在为一个瓶子创建一个样品,你的网址可能是这样的:
/bottles/<id of bottle>/swatches
你的路线应该是
post "/bottles/:bottle_id/swatches", to: 'swatches#create'
然后,在您的控制器SwatchesController上,您可以执行
def create
bottle = Bottle.find(params[:bottle_id])
swatch = current_user.swatches.create params[:swatch].merge(bottle: bottle)
if swatch.new_record?
#something if not saved
else
#something if saved
end
end