Rails метод redirect_to post? - PullRequest
12 голосов
/ 15 июня 2009
    redirect_to :controller=>'groups',:action=>'invite'

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

Edit:

У меня есть это в groups / 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 / пригласить.html.erb с group_id (я имею в виду, что после нажатия кнопки «отправить приглашение» будет создана группа, и тогда будет отображена текущая страница. показано) вот так:

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

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

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, но я не смог найти способ.

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

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

в rout.rb

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

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

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

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

Ответы [ 4 ]

36 голосов
/ 15 июня 2009

Ответ в том, что вы не можете сделать POST, используя redirect_to.

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

9 голосов
/ 16 июня 2009

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

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

создает URL-адрес, похожий на /groups/invite?group_id=1.

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

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

map.resources :groups

Вам необходимо добавить пользовательское действие для invite:

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

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

5 голосов
/ 03 июня 2011

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

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

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

1 голос
/ 25 января 2019

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

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

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

Должно быть доступно на рубинах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...