2013-08-26 6 views
1

Я получаю эту ошибку, не знаю, как ее исправить. странно, это было раньше. я думаю, после того, как я запустил аннотацию, он сломан, но не уверен. ошибка возникает из confs.controller index и собственных методов. также отвергает что-то вроде этого: conf.machine_brand [0,1] .upcase в NoMethodError [] бла бла это моя конф модель:rails 3.2 NoMethodError undefined метод `slice 'для nil: NilClass

# == Schema Information 
# 
# Table name: confs 
# 
# id     :integer   not null, primary key 
# machine_brand  :string(255) 
# machine_model  :string(255) 
# control_unit_brand :string(255) 
# control_unit_model :string(255) 
# tool_axis_x  :decimal(,) 
# tool_axis_y  :decimal(,) 
# tool_axis_z  :decimal(,) 
# rotary_axis_number :integer 
# linear_axis_number :integer 
# turning_mode  :boolean 
# milling_mode  :boolean 
# description  :text 
# xml    :text 
# user_id   :integer 
# developer_id  :integer 
# created_at   :datetime   not null 
# updated_at   :datetime   not null 
# 

class Conf < ActiveRecord::Base 
    attr_accessible :linear_axis_number, :control_unit_brand, :control_unit_model, :description, :developer_id, :machine_brand, :machine_model, :milling_mode, :rotary_axis_number, :tool_axis_x, :tool_axis_y, :tool_axis_z, :turning_mode, :user_id, :xml 

    belongs_to :developer, :class_name => 'User', :foreign_key => 'developer_id' 
    belongs_to :receiver, :class_name => 'User', :foreign_key => 'user_id' 

    validates :user_id, presence: true 
    validates :developer_id, presence: true 
end 

это confs.controller:

class ConfsController < ApplicationController 
before_filter :signed_in_user, only:[:index, :edit, :update, :destroy] 
before_filter :developer_user, only: :destroy 

def new 
    @conf = Conf.new 
end 

def index 
    @grouped = {} 
    Conf.all.each do |conf| 
    letter = conf.machine_brand.slice(0,1).upcase 
    @grouped[letter] ||= [] 
    @grouped[letter] << conf 
end 
end 

def show 
@conf = Conf.find(params[:id]) 

respond_to do |format| 
    format.html #index.html.erb 
    format.json { render json: @conf } 
    format.xml { render xml: @conf } 
    end 
end 

def own 
    @grouped = {} 
    Conf.where(:developer_id => current_user.id).each do |conf| 
    letter = conf.machine_brand.slice(0,1).upcase 
    @grouped[letter] ||= [] 
    @grouped[letter] << conf 
    end 
end 

def create 
@conf = Conf.new(conf_params) 

    if @conf.save 
    flash[:success] = "New Configuration uploaded!" 
    redirect_to conf_show_path 
    else 
    flash[:error] = "There is a problem!" 
    render 'new' 
    end 
end 

def destroy 
    @conf = Conf.find(params[:id]).destroy 
    redirect_to conf_show_own_path 
end 

def update 
    @conf.update_attributes(params[:conf]) 
end 

private 

def signed_in_user 
    unless signed_in? 
    store_location 
    redirect_to signin_url, notice: "Please sign in"  
    end 
end 

def admin_user 
    redirect_to(root_path) unless current_user.admin? 
end 

def developer_user 
    redirect_to(root_path) unless current_user.developer? 
end 

def conf_params 
    params.require(:conf).permit(:xml, :user_id, :developer_id) if params[:conf] 
end 

end 

и это conf.new, если вы хотите:

<% provide(:title, 'New Configuration')%> 
<h1> Upload new configuration </h1> 

<div class="row"> 
    <div class="span6 offset3"> 

    <%= form_for @conf, :html => {:multipart => true} do |f| %> 

    <%= f.label :machine_brand %> 
    <%= f.text_field :machine_brand %> 

    <%= f.label :machine_model %> 
    <%= f.text_field :machine_model %> 

    <%= f.label :control_unit_brand %> 
    <%= f.text_field :control_unit_brand %> 

    <%= f.label :control_unit_model %> 
    <%= f.text_field :control_unit_model %> 

    <%= f.label :tool_axis_x %> 
    <%= f.text_field :tool_axis_x %> 

    <%= f.label :tool_axis_y %> 
    <%= f.text_field :tool_axis_y %> 

    <%= f.label :tool_axis_z %> 
    <%= f.text_field :tool_axis_z %> 

    <%= f.label :rotary_axis_number %> 
    <%= f.text_field :rotary_axis_number %> 

    <%= f.label :linear_axis_number %> 
    <%= f.text_field :linear_axis_number %> 

    <%= f.label :turning_mode %> 
    <%= f.text_field :turning_mode %> 

    <%= f.label :milling_mode %> 
    <%= f.text_field :milling_mode %> 

    <%= f.label :description %> 
    <%= f.text_field :description %> 

    <%= f.label :xml %> 
    <%= f.text_field :xml %> 

    <%= f.label :client %> 
    <%= f.collection_select :user_id, User.where(:admin => false, :developer => false), :id, :name, options ={:prompt => "Select a client"}, :class =>"user" %> 

    <%= f.label :me %> 
    <%= f.collection_select :developer_id, User.where(:id => current_user.id), :id, :name, options ={:prompt => "Select me"}, :class =>"user" %> 

<br /> 
    <%= f.submit "Upload", class: "btn btn-large btn-primary" %> 
<% end %> 
    </div> 
</div> 
+0

Если это строка, вызывающая его 'letter = conf.machine_brand.slice (0,1) .upcase', то это означает, что возвращенный conf.machine_brand равен нулю и не устанавливается. Если он должен быть установлен, вам нужно будет получить подтверждение в своей модели, чтобы оно не создавалось без марки машины. –

+0

'conf.machine_brand.slice (0,1)' Я думаю, что вы получили здесь ошибку, так как у вас нет никакой связи между Conf и 'machine_brand', поэтому просто в вашем контроллере' letter = params [: machine_brand]. to_s.slice (0,1) .upcase' или 'letter = params [: conf] [: machine_brand] .to_s.slice (0,1) .upcase' –

+0

Я думаю, conf.machine_brand может быть пустым для определенных строк. Убедитесь, что conf.machine_brand имеет значение null в вашей базе данных. Или в IRC Conf.all –

ответ

1

conf.machine_brand.slice(0,1)
Я думаю, что вы получили эр ROR здесь machine_brand так просто сделать в контроллере
letter = params[:machine_brand].to_s.slice(0,1).upcase unless params[:machine_brand].blank?
или
letter = params[:conf][:machine_brand].to_s.slice(0,1).upcase unless params[:machine_brand].blank?

+0

как у него нет связи между Conf и machine_brand? Это в его attr_accessible, и это в его форме –

+0

@Althaf посмотри мой пост сейчас –

+0

Я добавил все атрибуты в conf_param и подтвердил их, поэтому моя проблема решена, большое вам спасибо – kalahari

0

Как @Rajarshi упоминалось, ошибка в следующем коде

conf.machine_brand.slice(0,1).upcase 

ошибка говорит, что вы звоните slice на объекте nil, что означает, что в одной из ваших записей conf есть nil machine_brand. Я не знаю, как вы хотели бы подойти к этой проблеме, но этот вопрос будет снижен, если добавить проверку, которая требует machine_brand

class Conf < ActiveRecord::Base 
    ... 
    validates :machine_brand, presence: true 

или вы можете получить только для записей, где machine_brand присутствует

Conf.where('machine_brand IS NOT NULL').each do |conf| 
    conf.machine_branch.slice(...) 
+0

он отправляет machine_brand через параметры, просматривая его файл –

+0

, который может быть правдой, но это не помешает conf (s) с нулевым machine_brand, который будет создан другими способами. – jvnill

+0

@RajarshiDas обратите внимание, что у него нет ': machine_brand' в его' conf_param' – j03w

Смежные вопросы