2015-03-04 3 views
0

Например, у меня есть PostController контроллера в RoR 4. и действия в нем:redirect_to в Rails 4

def index 
    @posts = Post.all.order('created_at DESC') 
end 

def new 
    @post = Post.new #second question 
end 

def create 
    @post = Post.new(post_params) 
    post.save 
    redirect_to @post #first question 
end 

def show 
    @post = Post.find(params[:id]) 
end 

private 
    def post_params 
     params.require(:post).permit(:title, :body) 
    end 

Итак, первый вопрос: почему, когда мы пишем redirect_to @post автоматически перенаправлять на show/id? Как рельсы знают, что он должен идти до show вид?

второй вопрос: почему я должен написать @post = Post.new в новом действии? когда я прокомментирую это, я также могу создать Post. Что такое почтение, напишите его в действии new или пропустите его?

Я новичок в рельсах и есть много магии в нем

+1

Вы можете поделиться полным контентом PostController, пожалуйста? – Dabrorius

+0

Эй @ Джейк Даниэль. Похоже, что мой ответ ввел некоторую путаницу. Не могли бы вы обновить свой вопрос и добавить шаблоны (как из «нового», так и из вашей формы - в случае, если вы переместили его на частичный)? Я хотел бы обновить свой ответ, чтобы в будущем не замечать какой-либо путаницы. Ура! –

ответ

1

Q1). Это часть одной из основных мантр RoR - условная конфигурация. Он просто предполагает, что при выполнении redirect_to @post вы действительно хотите увидеть ресурс @post. Стандартное действие REST «чтения» ресурса - show.

Но, если - к примеру - на ваш взгляд, вы будете делать что-то вроде

<%= link_to @post.title, @post, method: :delete %> 

Что будет генерироваться, что приведет вас к destroy действия ресурса @post «s.

Условные обозначения, подобные этому, заставляют вас писать меньше кода и - сделать вас счастливыми!

Q2). Я удивлен, если работа над вами. Этого не должно быть, потому что подобная магия выполняется в вашем теге form_for @post в ваших представлениях. Если @post пуст, form_for не должен быть в состоянии решить, что URL для генерации, или как вести себя в целом - в зависимости от Post.new хранится в @post это предполагает, что вы хотите create ресурс, и подготовить <form> тег смирились с POST методом , но если в @post хранится уже сохраненный ресурс, скажем Post.find(1), он создаст <form>, который будет отправлен с использованием метода PATCH.

Опять же - на основе конвенции вы можете написать меньше кода, чтобы достичь большего.

Настоятельно рекомендую отсутствующий что-то вроде @post = Post.new. Это может привести к затруднению идентификации ошибок, даже если это сработало для вас в данный момент.

Надеюсь, что это прояснит ситуацию!

Удачи вам!

+0

tnx для подробного ответа. Я понял. –

+0

Ваш второй ответ неверен. Форма не нуждается в @post для отправки действительной записи, она просто использует ее как место для размещения ошибок, если представление недействительно. Новая страница будет работать отлично, если вам не нужно отображать ошибки. –

+0

Позвольте мне проверить это - я проведу несколько тестов в купе версии Rails, и я обновлю свой ответ. Спасибо, что указали это! –

1

Первые вопросы: он перенаправляет вас на страницу показа с использованием метода url_for (вы можете прочитать его источник, если вам интересно), помните, что @book имеет идентификатор, поэтому он принимает этот идентификатор и включает его в URL-адрес /books/:id

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

для отображения ошибок недопустимого представления:

<%= form_for :post posts_path do |f| %> 

    <% if @post.errors.any? %> 

Посмотрите, как мы использовали @post выше? просто чтобы получить в нем ошибки.

1

При передаче записи на redirect_to url будет создан путем вызова url_for, который вернет именованный URL для этой записи. Для этого он использует имя класса для поиска. Таким образом, передача записи Post попытается использовать маршрут post_path с исходной записью в качестве параметра, который будет разрешен в /posts/:id.

0

Первый вопрос

Rails магии.

Когда вы передаете объект ActiveRecord для перенаправления, эта успокаивающая маршрутизация интерпретирует это, когда вы хотите перейти на страницу показа этого объекта.

Множество различных способов использования redirect_to here.

Второй вопрос

Обычно @post = Post.new требуется, как вы ссылаетесь @post в новом действии, как ваши формы, когда построены с form_for .. полезно для проверки и работы с ошибками.

Технически вы можете использовать form_tag и определить Post.new прямо там, в форме. Это будет означать, что @post = Post.new является избыточным и работает, когда вы его прокомментируете. Этот способ означал бы, что у вас нет способа передать ошибки объектов обратно пользователю на новой странице.

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