繁体   English   中英

如何在我的 Rails 模型中访问参数(或使用变通方法)?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM