2011-01-13 3 views
0

Я очень новичок в Rails, поэтому, возможно, я просто пропустил «Rails way» этого, но у меня есть модель, назовите ее Post. Я могу создать сообщение с канонической страницы posts/new, но также с другой страницы, скажем home/index.Rails: создать из двух страниц

В home/index У меня есть form_for @post (немного отличается от того, который находится в posts/new, но скажу, что я могу использовать частичный). Проблема заключается в том, что в PostController.create я не могу передать вновь созданный объект @post обратно home/index (в случае ошибки), потому что:

  • если не указать страницу для отображения, он будет автоматически оказывать posts/new
  • я не знаю страницу вызова для того, чтобы перенаправить его на вызывающей странице справа (posts/new или home/index)
  • даже если я знал, что это (взлом запроса реферер или с помощью redirect_to :back), redirect_to не передавать объекты обратно , так что @post пуст при вызове от home/index

Любая помощь? благодаря

EDIT

Может быть возможным решением было бы получить вызывающий контроллер/действие из запроса и сделать его обратно. Любой способ сделать это?

ответ

0

В теории, можно добиться того, что вы пытаетесь сделать, проверив реферер:

def create 
    @post = Post.new 

    if @post.update_attributes(params[:post]) 
    # redirect as appropriate 
    else 
    render :action => case request.referer 
     when new_post_path then "posts/new" 
     when "/" then "home/index" # assuming that home/index is the root of the site 
    end 
    end 
end 
0

Чтобы получить страницу реферера, вы можете сделать скрытое поле с именем redirect. Вы можете использовать его в контроллере.

redirect_to params[:redirect] || posts_path 

Вы пробовали, что вы передаете идентификатор Почты в строке запроса к home/index

например: /home/index?post_id=42

0

Вы можете узнать, кто назвал свою страницу, глядя на

request.referrer 

Я не знаю, является ли это «рельс», но вот мое решение.

Вы можете добавить маршрут для

match home/index/(:id) => "home#index" 

и перенаправлять на это после создания Post. Тогда в ваших Home контроллеры index действия вобще

@Post = Post.find(params[:index]) if params[:index] 

Ваше мнение должно отображаться сообщение, если @Post существует

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

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