Отправка формы по неправильному пути Неверный метод создания Simple_Form

2-е обновление

Это код моей модели

after_initialize :start_two_weeks


    def start_two_weeks
        @subscription = TrialSubscription.all 
        @subscription.manual_expiry_date = 
        @subscription.save
    end 

Как установить динамическое время с Time.now на Time.now - 2 недели? Это поле даты и времени, какое значение для поля даты и времени? Дополнительные обновления, это означает, что я не вышел из системы

Filter chain halted as :require_no_authentication rendered or redirected

Я вышел из системы, и пользователь был создан, но через контроллер регистрации ...

Обновлено. Я только что понял, что форма отправляется пользователям / пользователям. Контроллер регистрации наследуется от devise :: registration

Started POST "/users" for 127.0.0.1 at 2014-03-23 19:58:08 -0400
Processing by RegistrationsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"8xhRi7TBEA+zXfmuzuJLqLjjo5JMkyEjUmgmRT6DsOQ=", "user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]"}, "commit"=>"Create User"}
  User Load (0.7ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
Redirected to http://localhost:3000/
Filter chain halted as :require_no_authentication rendered or redirected
Completed 302 Found in 4.1ms (ActiveRecord: 0.7ms)

Форма не отправляется сюда

new_trial_subscription GET        /trial_subscriptions/new(.:format)                      trial_subscriptions#new

POST       /trial_subscriptions(.:format)                          trial_subscriptions#create

Хорошо, я пытаюсь воспроизвести то, что делал в консоли rails, чтобы поместить их в контроллеры.

У меня две модели

class TrialSubscription < ManualSubscription

    accepts_nested_attributes_for :user
    attr_accessible :user_attributes 

end 

ManualSubscription наследуется от Subscription и от модели Subscription

belongs_to :user

Я строю модель пользователя по подписке по какой-то другой причине.

в моей консоли рельсов я сделал это

@subscription = TrialSubscription.new
@user = @subscription.build_user(email: "[email protected]", password: "thisiseightcharacters")
@subscription.save

Я могу одновременно создать пользователя и связанную с ним пробную подписку. Я пытаюсь воспроизвести это в контроллере, и контент будет вводиться пользователем.

Это моя форма в

app / views / trial_subscriptions / new.html.erb

<%= simple_form_for @subscription.user do |f| %>
  <%= f.input :email %>
  <%= f.input :password %>
  <%= f.button :submit %>
<% end %>

я добавил

resources :trial_subscriptions

поэтому URL-адрес trial_subscriptions/new

это мой контроллер

class TrialSubscriptionsController < ApplicationController

    def index
    end 

    def new
        @subscription = TrialSubscription.new
        @subscription.build_user 
    end 

    def create
        @subscription = TrialSubscription.new(params[:subscription])
        @subscription.email = :email
        @subscription.password = :password
        if @subscription.save 
            flash[:notice] = "Trial Subscription has started"
        else
            flash[:error] = "There was an error creating this subscription, please try again"
        end 
    end 
end 

1) Что происходит между новым и созданным?

2) в моем методе создания params [: subscription] указывает на объект @subscription в моей форме, это правильно?

3): email на самом деле является атрибутом пользователя, правильно ли он передается по адресу @ subscription.email =: email?


person Jngai1297    schedule 23.03.2014    source источник


Ответы (1)


Ваше новое действие выглядит правильно, ваше действие создания нуждается в обновлении. Давайте сначала начнем с вашей ассоциации, затем перейдем к форме, а затем к вашему create действию.

В коде представления формы вы создаете форму для @subscription.user. Метод simple_form_for преобразовал бы это в действие create в UsersController. Но у вас этого нет, и вы собираетесь создавать с user по TrialSubscriptionsController.

Итак, чтобы это произошло, вам нужно изменить форму так, чтобы при визуализации и / или отправке она создавала форму для trial_subscription вместе с определенным user_attributes в trial_subscription. Итак, обновите свое представление, чтобы:

<%= simple_form_for @subscription do |f| %>
  <%= f.simple_fields_for :user do |u| %>
    <%= u.input :email %>
    <%= u.input :password %>
  <% end %>
  <%= f.button :submit %>
<% end %>

Изменения коснутся simple_form_for @subscription.user на simple_form_for @subscription, а поля email и password заключены в f.simple_fields_for :user. С этими изменениями, когда ваша форма будет отправлена, она выполнит действие create TrialSubscriptionsController.

Следующее изменение касается действия TrialSubscriptionsController#create.

def create
    @subscription = TrialSubscription.new(params[:trial_subscription])
    if @subscription.save 
        flash[:notice] = "Trial Subscription has started"
    else
        flash[:error] = "There was an error creating this subscription, please try again"
    end 
end

Изменения здесь: @subscription = TrialSubscription.new(params[:subscription]) на @subscripition = TrialSubscription.new(params[:trial_subscription]), потому что ваш объект имеет тип TrialSubscription, а не Subscription.

Второе изменение - удаление следующих строк:

@subscription.email = :email
@subscription.password = :password

Это потому, что, как вы говорите, email и password являются членами user, а не trial_subscription.

Надеюсь, это поможет.

person vee    schedule 23.03.2014
comment
если я хочу установить значения для поля в simple_form, знаете ли вы способ? в подписке есть поле: expiration_time (datetime), которое мне нужно установить только на 2 недели. Если я сделаю f.input в простой_форме, пользователь сможет установить собственное время? - person Jngai1297; 24.03.2014
comment
Да, f.input :expiration_time сработает. - person vee; 24.03.2014
comment
нет, потому что simple_form выведет календарь для пользователя, чтобы выбрать дату (потому что он видит тип datetime), я хочу установить его только в течение двухнедельного периода, чтобы отменить пробную версию, когда время истекло. - person Jngai1297; 24.03.2014
comment
Я понимаю, что вы имеете в виду, я не обратил внимания только на 2 недели. Я предположил, что ваш комментарий был больше, чтобы включать поле даты для trial_subscription. Если ваше требование - установить эту дату самостоятельно, а не выбирать ее пользователем, вы можете сделать это с помощью обратного вызова after_save. Или лучше инициализировать все trial_subscription с 2 weeks expiration date, добавив обратный вызов after_initialize на trial_subscription модели. - person vee; 24.03.2014
comment
у тебя есть время еще на один вопрос? - person Jngai1297; 24.03.2014