2016-05-04 19 views
0

我有一個函數在我的模型中從CSV文件導入數據,我想驗證應該有任何錯誤。例如,當我上傳文件時,我根據文件中的ID搜索User。如果沒有User與該ID,我想redirect_to一個錯誤的另一頁。Redirect_to模型出錯後

def self.getUser(scale_id) 
    @user = User.find_by(scale_id: scale_id) 
    if @user == nil 
     redirect_to users_path 
    else 
     return @user 
    end 
end 

def self.bulk_upload_weigh_ins(file) 
    output = [] 
    errors = [] 
    CSV.foreach(file.path, headers: true,) do |row| 
     row = row.to_hash 
     @scale_id = row["scale_id"] 
     @user = getUser(@scale_id) 
     row.merge!(user_id: @user_id) 
     WeighIn.create! row.to_hash 
    end 
end 

...而且無論我把什麼路那裏,我得到如下:undefined local variable or method 'users_path' for #<Class:0x007fa06f466998>即使它是一個有效的路徑。

像這樣重定向有什麼問題嗎?如果是,我該怎麼做?

+0

路徑助手在模型中不可用,除非您特別包含它們。不應特別包括它們;模型應該儘可能的不可知,並且不應該有關於網絡事物的具體知識。另外,遵循Ruby約定並命名方法'get_user'可能是一個好主意......但我會更進一步並說方法命名不正確。你將在你的模型中設置一個類級的實例變量 - 你應該返回一個本地的'user'實例,而不是使用一個類級的實例變量。海事組織不應該擁有自己的方法。 –

回答

0

最清晰的方式進行自定義驗證是做這樣的事情:

在你的模型:

User < ActiveRecord::Base 

validate :get_user 

def initialize(params={}) 
    self.id = params[:id] 
end 

def get_user 
    @user = User.find_by(self.id) 
    if @user.nil? 
     errors.add(:base, "Invalid User") 
     return false 
    else 
     return @user 
    end 
end 

在您的控制器,那麼你會怎麼做:

def whatever_action_youre_using 
    @user = User.new(user_params) 
    unless @user.valid? 
    redirect_to users_path 
    end 
end 


def user_params 
    params.require(:user).permit(:first_name, :email, :etc, :whatever_your_atts) 
end 
+0

我應該在我的問題上更清楚,我會添加更多的信息來讓我真正的問題得到理解 –

0

我在我的模型中找到一個基於 ID

012的用戶

未定義的局部變量或方法「users_path」的 類:0x007fa06f466998

由於@戴夫牛頓在評論中提到的,路徑傭工不可模型中,除非你明確包括他們。您也不能也不需要使用redirect_to中的型號。應用程序邏輯應移至控制器。像下面這樣的東西應該可以工作

def get_user 
    @user = User.find_by(scale_id: params[:user][:scale_id]) 
    if @user.nil? 
    redirect_to users_path, notice: 'Your error message here' 
    else 
    return @user 
    end 
end 
+0

我不確定爲什麼CSV導入功能在模型中。我正在關注一個RailsCast插曲,但是如果我將它保存在我的控制器中,似乎所有內容都會更流暢 –