2015-10-09 29 views
1

我有一个问题,在与Rails的创建操作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 

回答

0

要添加到答案,也有一些修正,你可以让你的代码:


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 PARAMS

Rails的strong params功能是说明你需要 “规定” 的顶级PARAM非常具体,然后在 “许可证” 其子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 

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

+1

嗨丰富非常感谢您的帮助,我是新的在ROR中,所以我非常感谢所有对我的代码的建议,特别是那种更好的开发人员的建议,谢谢! –

3

尝试重写你的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在你原来的代码是相反的。

希望它有帮助!

+0

谢谢卓然,那是错误..对不起菜鸟错误我是新的ROR,我不注意代码的那部分... –