【问题标题】:Rails New Action with Different Models不同模型的 Rails 新动作
【发布时间】:2016-01-06 21:56:53
【问题描述】:

我在 Rails 中遇到了创建操作的问题 - 我的控制器中有以下信息:

ComputerController 
def create
  @computer = Computer.new(computer_params)
  redirect_to computers_path
end

private  
 def computer_params
 require.params(:computer).permit(:computer_name,
 :cpu_tag,:serial,:location,:brand,:model,:ram,:cpu,:os,:warranty,:comments)  
end

然后在我的模型中我有一些验证:

class Computer < ActiveRecord::Base
 validates :computer_name,  uniqueness: true, presence: true,
 length:{maximum: 12} 
 validates :cpu_tag, length: {maximum: 4}, uniqueness: true, 
 :numericality =>   {:only_integer => true}
 validates :serial, presence: true
 validates :location, presence: true
 validates :brand, presence: true
 validates :model, presence: true
 validates :ram, presence: true
 validates :cpu, presence: true
 validates :os, presence: true
 validates :warranty, presence: true
 validates :comments, presence: true
end

视图new.html.erb是:

<div class="row text-center">
 <h2 class = "mimsinfoblackindex">Add A Computer To The Inventory </h2><hr/>

<div class="col-md-3 description_pc text-left">
   <%= form_for @computer do |f|%>  

    <h4 class = "mimsformgreen">
      <%= f.label :computer_name,'Computer Name:'%>
      <%= f.text_field :computer_name%>
    </h4>

    <h4 class = "mimsformblack">
      <%= f.label :cpu_tag, 'Computer Tag:'%>
      <%= f.text_field :cpu_tag%>
    </h4>

    <h4 class = "mimsformblack">
      <%= f.label :serial, 'Serial:'%>
      <%= f.text_field :serial%>
    </h4>

    <h4 class = "mimsformblack">
      <%= f.label :location, 'Location:'%> 
      <%= f.text_field :location%>
    </h4>

    <h4 class = "mimsformblack">
      <%= f.label :brand, 'Brand:'%>
      <%= f.text_field :brand%>
    </h4>

    <h4 class = "mimsformblack">
      <%= f.label :model, 'Model:'%>
      <%= f.text_field :model%>
    </h4>

    <h4 class = "mimsformblack">
      <%= f.label :ram, 'Ram:'%> 
      <%= f.text_field :ram%>
    </h4>

    <h4 class = "mimsformblack">  
      <%= f.label :cpu, 'Processor:'%>
      <%= f.text_field :cpu %>
    </h4>

    <h4 class = "mimsformblack">
      <%= f.label :os, 'Operating System:'%> 
      <%= f.text_field :os%>
    </h4>

    <h4 class = "mimsformblack">
      <%= f.label :warranty, 'Warranty:'%>
      <%= f.text_field :warranty%>
    </h4>

     <h4 class = "mimsformblack">
      <%= f.label :comments, 'Comments:'%>
      <%= f.text_field :comments%>
    </h4>

        <%= f.submit 'Add The Computer'%>
  <% end %>

我已经为我的模型进行了 TDD,我没有任何问题,但是当我提交计算机表单时,我在屏幕上收到一条错误消息:

 wrong number of arguments (0 for 1)
 private  
 def computer_params
  require.params(:computer).permit(:computer_name,:cpu_tag,
  :serial,:location,:brand,:model,:ram,:cpu,:os,:warranty,:comments)  
 end

【问题讨论】:

    标签: ruby-on-rails ruby strong-parameters


    【解决方案1】:

    尝试将您的computer_params 重写为:

    private  
    
    def computer_params
      params.require(:computer).permit(:computer_name, :cpu_tag, :serial, :location, :brand, :model, :ram, :cpu, :os, :warranty, :comments)  
    end
    

    您的原始代码中的paramsrequire 似乎颠倒了。

    希望对你有帮助!

    【讨论】:

    • 谢谢 Zoran,那是错误.. 抱歉新手错误我是 ROR 新手,我不注意代码的那部分...
    【解决方案2】:

    为了补充答案,您可以使用您的代码进行一些修复:


    1 验证

    定义相同的presence验证时,可以pass multiple arguments(属性)给方法:

    #app/models/computer.rb
    class Computer < ActiveRecord::Base
       validates :serial, :location, :brand, :model, :ram, :cpu, :os, :warranty, :comments, presence: true
    end
    

    2 参数

    Rails 的 strong params 功能非常具体地说明您需要“要求”一个顶级参数,然后“允许”它的子参数:

    def computer_params
      params.require(:computer).permit(:computer_name,:cpu_tag, :serial,:location,:brand,:model,:ram,:cpu,:os,:warranty,:comments)  
    end
    

    3 个循环

    在编程中,最高效的代码获胜。

    这意味着您不应该一次又一次地复制一堆代码(使用attributes 方法):

    #app/views/computers/new.html.erb
    <%= form_for @computer do |f| %>
    
        <% @computer.attributes.each do |attr| %>
           <% xtra = "green" if attr == :computer_name %>
           <%= content_tag :h4, class: "misform #{xtra}" do %>
              <%= f.label attr.to_sym, attr.titleize + ":" %>
              <%= f.text_field attr.to_sym %>
           <% end %>
        <% end %>
    
        <%= f.submit 'Add The Computer'%>
    <% end %>
    

    看看清洁度有多高?


    4 个 HTML 类

    你已经使用了这两个类名:

    mimsformblack mimsformgreen

    看看我的#3推​​荐,你能看出这是多么低效吗?这违反了一个名为 DRY (Don't Repeat Yourself) 的原则,在该原则中,您应该使用尽可能少的代码和尽可能多的功能。

    您可以将multiple CSS classes 应用于每个元素,这意味着您将能够执行以下操作:

    <div class="mimsform">This will be black</div> 
    <div class="mimsform green">This will be green</div>
    

    5 创建

    当您在 Rails 中创建时,您必须将对象保存到模型中:

    def create
      @computer = Computer.new computer_params
      redirect_to computers_path if @computer.save
    end
    

    许多新手开发人员不保存他们的新对象,从而阻止他们将数据实际保存到数据库中。

    【讨论】:

    • 嗨 Rich 非常感谢您的帮助,我是 ROR 的新手,所以我感谢所有对我的代码的建议,特别是那些对成为更好的开发人员的建议,谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多