RAILS3: передать произвольные параметры через button_to?

Я пытаюсь сделать что-то очень просто в моем первом приложении Rails (Rails 3), и я не уверен, что я делаю неправильно, или если есть лучший подход. Невозможно найти что-либо в Интернете или здесь, что решило его для меня, несмотря на многочисленные поиски.

В приложении у меня есть WorkRequests и статьи. При просмотре статьи я хочу, чтобы кнопка создала WorkRequest и, когда появилась новая форма WorkRequest, заполнила статью. По сути, я пытаюсь передать Article.id в новый WorkRequest.

Работает в link_ только путем добавления параметра, но я хочу, чтобы это была кнопка. Пока он отображается в HTML-форме статьи как параметр запроса, он никогда не попадает в метод WorkRequest.new. Эта статья в 2010 году объясняет проблему в деталях, но решение не работает для меня (см. мой комментарий в конце страницы.)

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

Спасибо заранее.

Ответы

Ответ 1

Просто вернитесь, чтобы закончить это. В конечном итоге я решил это, используя link_to, но используя jQuery, чтобы он выглядел как кнопка. @kishie, если вы говорите, что сделали эту работу с button_to, я бы хотел увидеть код, но поскольку мне нравится jQuery, он решил, насколько мне известно (для этого приложения, во всяком случае.)

Здесь показан код в статье # show view. (Класс - это то, что делает его похожим на кнопку с помощью jQuery.)

<%= link_to "New Request", new_work_request_path(:article_id => @article.id), :class => "ui-button" %>

Здесь код в контроллере Work_Request новый метод:

if !params[:article_id].blank?
  @work_request.article = Article.find(params[:article_id])
end

Затем новое представление Work_Request # отображает его правильно.

Ответ 2

Добавьте эту строку кода в файл routes.rb.

resources :work_requests do
  member do 
    post 'new'
  end
end

Это не должен быть метод GET, потому что вы отправляете информацию на сервер через: module_id. Затем это сработает.

<%= button_to("Add WorkRequest", {:controller => "work_request", :action => "new", :article_id => @article.id})%>

Ответ 3

Я просто ударил аналогичную проблему, и я получил ее для работы, передав параметр следующим образом:

<%= button_to("Add WorkRequest", new_work_request_path(:article_id => @article.id), :action => "new", :method => :get)%>

Ответ 4

В статье # show

<%= button_to("Add WorkRequest", {:controller => "work_request", :action => "new", :article_id => @article.id})%>

В work_requests # new

<%= f.text_field :article_id, :value => params[:article_id]%>

Ответ 5

Если вы вложите resources для :work_requests в :articles в :articles в routes.rb, а затем передайте params[:id], который будет вашим article_id, и добавьте :method => :get в вызов button_to, вы должно быть хорошо.

# config/routes.rb
resources :articles do
  resources :work_requests
end

# app/views/articles/show.html.erb
<%= button_to "Add Work Request", new_article_work_request_path(params[:id]), 
    :method => :get %>

# app/controllers/work_requests_controller.rb
class WorkRequestsController < ApplicationController

  ...
  def new
    @work_item = WorkItem.new
    @article = Article.find(params[:article_id])
    ...
  end

  ...
end