Подтвердить что ты не робот

Rails redirect_to post метод?

    redirect_to :controller=>'groups',:action=>'invite'

но я получил ошибку, потому что redirect_to посылает метод GET. Я хочу изменить этот метод на "POST", нет опции метода: redirect_to, что я буду делать? Могу ли я сделать это без redirect_to.

Edit:

У меня это в группах /invite.html.erb

<%= link_to "Send invite", group_members_path(:group_member=>{:user_id=>friendship.friend.id,  :group_id=>@group.id,:sender_id=>current_user.id,:status=>"requested"}), :method => :post %>

Этот вызов вызова создает действие в контроллере group_members, и после создания действия я хочу показать groups/invite.html.erb с group_id (я имею в виду, после того, как будут созданы кнопки "Отправить приглашение", будут отображаться group_members, а затем текущая страница будет показано) следующим образом:

redirect_to :controller=>'groups',:action=>'invite',:group_id=>@group_member.group_id

После redirect_to запросить это с помощью метода GET, он вызывает действие show в группе и принимает приглашение как id и дает эту ошибку

Couldn't find Group with ID=invite

Мое приглашение в группе

    def invite
@friendships = current_user.friendships.find(:all,:conditions=>"status='accepted'")
@requested_friendships=current_user.requested_friendships.find(:all,:conditions=>"status='accepted'")
@group=Group.find(params[:group_id])
 end

Решение: мне нужно перенаправить это методом POST, но я не смог найти способ.

Уродливое решение: я решил эту проблему, которую я не предпочитаю. Я все еще жду, если у вас есть решение честно.

Мое решение добавляет маршрут для приглашения, чтобы избавиться от ошибки "Не удалось найти группу с идентификатором ID = приглашение".

в routes.rb

   map.connect "/invite",:controller=>'groups',:action=>'invite'

в создании действия

   redirect_to "/invite?group_id=#{@group_member.group_id}"

Я назову это решение на языке "amele yontemi" на английском языке "ручной рабочий метод" (я думаю).

4b9b3361

Ответ 1

Похоже, вы сработали, как работает маршрутизация Rails. Этот код:

redirect_to :controller=>'groups',:action=>'invite',:group_id=>@group_member.group_id

создает URL-адрес, который выглядит примерно как /groups/invite?group_id=1.

Без отображения в вашем routes.rb маршрутизатор Rails сопоставляет это с действием show, а не invite. Часть URL invite сопоставляется с params[:id], и когда она пытается найти эту запись в базе данных, она терпит неудачу и вы получите сообщение, которое вы нашли.

Если вы используете маршруты RESTful, у вас уже есть строка map.resources, которая выглядит так:

map.resources :groups

Вам нужно добавить настраиваемое действие для invite:

map.resources :groups, :member => { :invite => :get }

Затем измените ссылку на params[:group_id] в методе #invite, чтобы использовать только params[:id].

Ответ 2

Ответ заключается в том, что вы не можете выполнять POST с помощью redirect_to.

Это происходит из-за того, что redirect_to просто отправляет HTTP-адрес переадресации HTTP 30x в браузер, который, в свою очередь, получает целевой URL, а браузеры делают только GET при переадресации

Ответ 3

Я нашел одноразовое решение, которое мне нужно было сделать в Rails 3. Я сделал маршрут, который вызовет метод в этом контроллере, который требует почтового вызова. Строка в "route.rb", например:

match '/create', :to => "content#create"

Вероятно, уродливые, но отчаянные времена требуют отчаянных мер. Просто подумал, что я поделюсь.

Ответ 4

Идея состоит в том, чтобы сделать "перенаправление", в то время как вы создаете форму с помощью метода: post.

Я столкнулся с той же проблемой и извлек решение в repost gem, поэтому он делает всю работу за вас, поэтому не нужно создавать отдельное представление с формой, просто используйте предоставляемую функцией gem redirect_post() на вашем контроллере,

class MyController < ActionController::Base
...
  def some_action
    redirect_post('url', params: {}, options: {})
  end
...
end

Должен быть доступен на rubygems.