RAILS3: Pass arbitrary parameters via button_to?

假如想象 提交于 2019-12-18 12:15:51

问题


I'm trying to do something very simple in my first Rails app (Rails 3) and I'm not sure what I'm doing wrong, or if there's a better approach. Can't find anything on the web or here that has solved it for me despite much searching.

In the app I have WorkRequests and Articles. When viewing an Article, I want a button to create a WorkRequest and, when the new WorkRequest form appears, have the article filled in. Essentially, I'm trying to pass the Article.id to the new WorkRequest.

Works in link_to just by adding the parameter, but I want it to be a button. While it shows up in the Article form's HTML as a query parameter, it never gets to the WorkRequest.new method. This article from 2010 explains the problem in some detail, but the solution does not work for me (see my comment at the end of the page.)

This seems like it should be a fairly easy and common thing to do (once I figure it out, there are several other places in my own app where I want to do the same thing) but I've been banging my head against this particular wall for a few days now. I am new to Rails--this is my first app--so I hope someone more experienced can help!

Thanks in advance.


回答1:


Just circling back to finish this up. Ultimately I solved this by using link_to but using jQuery to make it look like a button. @kishie, if you're saying you made this work with button_to I'd like to see the code, but as I like jQuery it's solved as far as I'm concerned (for this app, anyway.)

Here's the code in Article#show view. (The class is what makes it look like a button via jQuery.)

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

Here's the code in Work_Request controller's new method:

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

Then the Work_Request#new view renders it properly.




回答2:


Add this line of code in your routes.rb file.

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

It shouldn't be the GET method because you're sending information to the server, via :module_id. This will then work.

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



回答3:


I just hit a similar issue and I got it to work by passing the parameter as follows:

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



回答4:


In article#show

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

In work_requests#new

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




回答5:


If you nest your resources for :work_requests within :articles in your routes.rb, then pass your params[:id] which would be your article_id and add :method => :get to the button_to call, you should be okay.

# 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


来源:https://stackoverflow.com/questions/5363153/rails3-pass-arbitrary-parameters-via-button-to

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!