2015-06-16 5 views
-1

У меня есть домашний контроллер и вы пытаетесь обновить поле таблицы с помощью другого контроллера.save_with_captcha нет в контроллере

Главная контроллер

class HomeController < ApplicationController 

    before_action :user_params, only: [:index] 

    def index 
     @email = Email.new(user_params) 
    end 

    def contact 
    end 

    def faq 
    end 

    def team 
    end 

    def privacy 
    end 

    def esave 
    if !user_params.nil? 
     if @email.save_with_captcha 
     flash[:notice] = "Thank you for registering you email address" 
     redirect_to :action => 'index' 
     else 
     render 'esave' 
     end 
    end 
    end 

    def user_params 
     params.require(:email).permit(:email, :captcha, :captcha_key) if params[:email] 
    end 

end 

Так что я пытаюсь создать новое поле Email модели в моем родном контроллере, но когда я нажимаю сохранить он бросает эту ошибку ...

App 24078 stderr: Completed 500 Internal Server Error in 3ms 
App 24078 stderr: 
App 24078 stderr: NoMethodError (undefined method `save_with_captcha' for nil:NilClass): 
App 24078 stderr: app/controllers/home_controller.rb:37:in `esave' 

У меня есть электронная почта модель с определенными валидациями, которая подобна этому

class Email < ActiveRecord::Base 
apply_simple_captcha :message => "The secret Image and code were different", :add_to_base => true 
validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/ , :message => "Invalid Format" 

конец

Так что я не understnd, почему это save_simple_captcha отсутствует, любые предложения

+0

Вы должны определить '@ email' что-то вроде' @email = Email.find (params [: id]) ' – Pavan

+0

, но я уже определил электронную почту в методе индекса, но как насчет валидации user_params? – user3290805

+0

Вы также определили его в методе 'esave'. Поскольку это ** метод экземпляра ** и вам нужно определить ** экземпляры объектов ** для каждого метода экземпляра – Pavan

ответ

0

Вот мои 2 цента.

Помните, что HTTP не имеет гражданства. Вы определили @email в индексе, вы попали в esave после того, как страница была обновлена, поэтому @email больше не доступен. (Controller немного отличается выпрямить рубин класса, которые получают экземпляры и переменные могут быть брошены вокруг)

Вы должны создать экземпляр @email для метода ваш находятся. я не знаю, что в вашей модели так Я просто догадываюсь об остальном.

Возможно, это @email = Email.find(params[:id]), так как я не знаю вашу модель. (как указано в других комментариях)

Поставьте свою модель здесь. Мы могли бы помочь вам.

PS: Это не очень хорошая идея, чтобы принять в код на рамки, когда вы не знаете, очень основной его :)