Как определить пользовательский URL для страницы подтверждения формы?

Я создаю базовую целевую страницу продукта с помощью Rails, на которой пользователи могут вводить свой адрес электронной почты, чтобы получать уведомления о запуске продукта. (Да, есть сервисы / гемы и т. Д., Которые могли бы сделать это для меня, но я новичок в программировании и хочу создать его сам, чтобы изучать рельсы.)

При успешной отправке формы я хотел бы перенаправить на пользовательскую страницу "/ спасибо", на которой я благодарю пользователей за их интерес к продукту (а также рекомендую им пройти небольшой опрос).

В настоящее время успешные отправки отображаются в "/ invites/:id/", например "invites/3", который мне не нужен, так как он показывает количество приглашений, которые были отправлены. Вместо этого я хотел бы перенаправить все успешные отправки на страницу "/ спасибо".

Я пытался исследовать "rails custom URLs", но не смог найти ничего подходящего. Самым близким, что мне удалось найти, был этот пост Stackru о том, как перенаправить с помощью пользовательских маршрутов, но он не полностью понял рекомендуемое решение. Я также попытался прочитать Руководство по Rails по маршрутам, но я новичок в этом и не увидел ничего, что я понял, чтобы можно было создать собственный URL.

Я разместил свое сообщение с благодарностью, которое я хотел бы отобразить в успешной форме отправки в "views / invites / show.html.haml"

Мой маршрут

resources :invites
root :to => 'invites#new'

Я пробовал вставлять в rout.rb:

post "/:thanks" => "invites#show", :as => :thanks

Но я не знаю, будет ли это работать или как я скажу контроллеру перенаправить: спасибо

Мой контроллер (в основном ванильные рельсы, сюда включены только соответствующие действия):

def show
    @invite = Invite.find(params[:id])
    show_path = "/thanks"

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @invite }
    end
  end

# GET /invites/new
# GET /invites/new.json
def new
  @invite = Invite.new

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @invite }
  end
 end

 # POST /invites
 # POST /invites.json
 def create
   @invite = Invite.new(params[:invite])

   respond_to do |format|
     if @invite.save
       format.html { redirect_to @invite }
       #format.js { render :action => 'create_success' }
       format.json { render json: @invite, status: :created, location: @invite }
     else
       format.html { render action: "new" }
       #format.js { render :action => 'create_fail' }
       format.json { render json: @invite.errors, status: :unprocessable_entity }
     end
   end
 end

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

3 ответа

Решение

Я предполагаю, что вы хотите перенаправить после вашего действия создания, которое выполняется при отправке формы.

Просто добавьте redirect_to следующим образом:

def create
  @invite = Invite.new(params[:invite])

  if @invite.save
    ...
    redirect_to '/thanks'
  else
    ...
    redirect_to new_invite_path # if you want to return to the form submission page on error
  end
end

Я опустил часть кода для краткости.

В ваших маршрутах добавьте:

get '/thanks', to: "invites#thanks"

Добавьте действие спасибо в ваш контроллер приглашений:

def thanks
  # something here if needed
end

И создайте страницу thanks.html.erb в приложении /views/invites.

Я бы сделал get "/thanks" => "invites#thanks" в routes.rb и затем добавьте это в свой контроллер:

def thanks
end

Затем добавьте файл app/views/invites/thanks.html.erb с вашим содержанием благодарности.

Вы можете создать маршрут следующим образом:

resources :invites do
  collection do
    get 'thanks'
  end
end

Это также создаст вспомогательный путь под названием thanks_invites_path,

Это будет на invites/thanks путь, но если вы хотите, чтобы он был на/thanksВы могли бы просто сделать, как упоминал Джейсон:

get "/thanks" => "invites#thanks", :as => :thanks

as part сгенерирует помощника для доступа к этой странице: thanks_path,

Вам потребуется дополнительное действие в контроллере под названием thanksи поместите всю необходимую информацию внутри, а также вам понадобится дополнительный вид под названием thanks.html.erb

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

format.html { redirect_to thanks_invites_path} (или же thanks_path), что бы вы ни выбрали, когда вы называете маршрут, вы можете проверить его с rake routes если все в порядке, и все rake routes говорит, просто добавь _path в конце.

Другие вопросы по тегам