[英]How can I access params (or utilize a workaround) in my rails model?
我正在尝试将 Rails 控制器中的一些代码重构为我的模型,但我发现我对 rails 工作原理的理解存在差距。 我试图让 Raffle 类可以使用这 2 种方法,但我正在努力理解如何做到这一点。 当我点击此代码时,返回错误“#Raffle:0x00007f88c9af8940 的未定义局部变量或方法`params'”。
如何解决模型无法使用的参数? 抱歉,如果这是一个初学者问题 - 我绝对是一个初学者。
#app/models/raffle.rb
class Raffle < ApplicationRecord
has_many :tickets
has_many :users, through: :tickets
def bid_tickets(tier)
params[:raffle][:"tier"].to_i #error returned here
end
def bid_total
(bid_tickets(gold) * 3) + (bid_tickets(silver) * 2) + bid_tickets(bronze)
end
#app/views/edit.html.erb
<%= form_for(@raffle) do |f| %>
<%=f.label :ticket, "Gold" %>: <br>
<%= image_tag "gold.jpg", class: "small_ticket" %><br>
<%=f.number_field :gold%><br>
<%=f.label :ticket, "Silver" %>:<br>
<%= image_tag "silver.jpg", class: "small_ticket" %><br>
<%=f.number_field :silver %><br>
<%=f.label :ticket, "Bronze" %>:<br>
<%= image_tag "bronze.jpg", class: "small_ticket" %><br>
<%=f.number_field :bronze %> <br><br>
<%= f.submit "Use Tickets" %>
<% end %><br>
#app/controllers/raffles_controller.rb
def update
if @raffle.enough_slots? + @raffle.current_bids > @raffle.number_of_ticket_slots
if enough_tickets?
redirect_to edit_raffle_path, notice: "You do not have enough tickets."
else
redirect_to edit_raffle_path, notice: "There aren't enough spots left in this raffle to handle your entry! Please use less tickets."
end
else @raffle.update_tickets(current_user)
if @raffle.slots_filled?
@raffle.select_winner
end
redirect_to edit_raffle_path(@raffle)
end
end
returned parameters:
{"_method"=>"patch",
"authenticity_token"=>"xyz",
"raffle"=>{"gold"=>"1", "silver"=>"", "bronze"=>""},
"commit"=>"Use Tickets",
"id"=>"1"}
编辑:
#app/controllers/raffles_controller.rb (StrongParameters)
class RafflesController < ApplicationController
private
def raffle_params
params.require(:raffle).permit(:product_name, :product_description,
:product_image, :number_of_ticket_slots, :filter)
end
end
params
在控制器中提供给你(通过 Rails),因为它是一个“网络请求”。 最好不要将它更深入地传递到您的系统中,因为它包含外部“不受信任”的输入。 这就是它在模型中不会自动可用的原因。
例如:
# controller
def update
safe_value = validate_value(params[:unsafe_value]) # extract and validate
# no "web request things" passed in
result = MyFeature.do_stuff(@current_user, safe_value) # pass it to other parts of system
# then convert the result back into a "web request thing", e.g:
# return render json: as_json(result) # return result as json
# return redirect_to endpoint_for(result) # redirect based on result
# etc
end
在将数据作为参数传递给系统的其他部分(例如模型)之前,对参数进行预处理(提取值、验证它们等)是一种很好的做法。
这将使系统的其余部分与“Web 请求事物”无关,使它们以目的为中心并且组织良好。
首先, StrongParameters
是一个内置的 Rails 功能,可以帮助解决这个问题。
另一个建议是在使用参数的代码中放置一个 binding.pry 或 byebug(在确保它已通过捆绑安装和更新之后),然后运行您的代码。 触发类型参数后,您将看到细分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.