2015-08-03 2 views
0

У меня есть форма подписки, где я пытаюсь установить выбранный вами план, бизнес, который они хотели бы связать с подпиской и данными платежа. В моей форме я использую выберите тег, чтобы отобразить список всех предприятий и отображается правильно, на мой взгляд, но на сохранить я получаю следующее сообщение об ошибке:Выбрать тег, неопределенный метод `map '

undefined method `map' for #<Business:0x007f8ea7955b90> 

new.html.erb

<div class="field"> 
    <%= select_tag :business_id, options_from_collection_for_select(@businesses, "id", "name") %> 
</div> 

subscriptions_controller.rb

... 

def new 
    @subscription = Subscription.new 
    @plan = Plan.find(params["plan_id"]) 
    @businesses = Business.all 
end 

def create 
    @subscription = Subscription.new(subscription_params) 
    raise "Please, check subscription errors" unless @subscription.valid? 
    @subscription.process_payment 
    @subscription.save 
    redirect_to @subscription, notice: 'Subscription was successfully created.' 
rescue => e 
    flash[:error] = e.message 
    render :new 
end 

private 

    def set_subscription 
    @subscription = Subscription.find(params[:id]) 
    end 

    def subscription_params 
    params.require(:subscription).permit(:plan_id, :business_id, :card_token, :coupon) 
    end 

Am I настройки select_tag правильно? Нужно ли исправить мой метод создания? Посмотрел на другие решения на SO с небольшим успехом.

enter image description here

+0

Не могли бы вы добавить несколько строк из верхней части трассировки стека ошибок? Думаю, до десяти строк должно быть достаточно. – amar47shah

+0

@ amar47shah делает изображение выше? –

+0

Да, это действительно помогает. Похоже, что действие 'create' пыталось снова отобразить шаблон' new', возможно, потому, что новая подписка была недействительной. Обратите внимание, что 'render: new' не вызывает действие' new' в контроллере. Мне все еще сложно рассказать, что происходит. Похоже, что значение '@ business' изменилось из коллекции в единый бизнес, но я не могу понять, почему.Для целей отладки попробуйте снова установить '@businesses = Business.all' в блок' rescue' '' create'. О, подождите, теперь у меня есть идея! – amar47shah

ответ

0

Rails создает новый контроллер для каждого запроса. Есть некоторая информация об этом here.

Это означает, что любые переменные экземпляра, которые вы установили в new, будут недоступны при обработке POST в create.

В вашем случае вы создаете шаблон :new в блоке аварийного восстановления create, когда новая подписка не проходит проверку. Вы только получаете ошибку на данный момент, а не когда вы первоначально обращаетесь к форме.

Проблема в том, что render :new не вызывает действие new; он просто отображает шаблон. В случае неудачной проверки подписки и повторной обработки формы действие new никогда не вызывалось этим экземпляром контроллера, а переменные экземпляра не имеют ожидаемых шаблоном значений.

Попробуйте вместо render :new:

redirect_to new_subscription_url 

Это экземпляр нового контроллера и вызвать new действие, так что вы будете начинать с чистого листа. Переменные экземпляра, необходимые в шаблоне new, будут назначены правильные значения перед визуализацией шаблона.

В качестве альтернативы, вы можете установить переменный экземпляр в спасательном блоке:

def create 
... 
rescue => e 
    flash[:error] = e.message 
    @businesses = Business.all 
    render :new 
end 

Вот подобный question на переполнении стека.

Надеюсь, что это поможет. Счастливое кодирование!

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