Programing

Rails : 하나의 양식에서 다중 제출 버튼

crosscheck 2020. 12. 9. 07:50
반응형

Rails : 하나의 양식에서 다중 제출 버튼


기사 모델이 있고 기사 '새'보기에 "게시"및 "초안 저장"이라는 두 개의 버튼이 있다고 가정합니다.

내 질문은 컨트롤러에서 어떤 버튼이 클릭되었는지 어떻게 알 수 있습니까?

이미 해결책이 있지만 더 나은 방법이있을 것 같습니다. 현재보기에서 사용한 것은 다음과 같습니다.

<div class="actions">
  <%= f.submit "Publish" %>
  <%= f.submit "Save Draft", :name => "commit" %>
</div>

따라서 컨트롤러에서 params [: commit] 문자열을 사용하여 해당 작업을 처리 할 수 ​​있습니다.

def create
  @article = Article.new(params[:article])
  if params[:commit] == "Publish"
    @article.status = 'publish'
    // detail omitted
  end

  @article.save
end

하지만 뷰 관련 문자열을 사용하는 것은 좋지 않다고 생각합니다. 이 작업을 수행하는 다른 방법을 말씀해 주시겠습니까?

업데이트 :이 버튼은 같은 형태이기 때문에 모두 '만들기'작업으로 이동하며 괜찮습니다. 내가 원하는 것은 Article 모델에 'status'열을 제공하고 'public'또는 'draft'를 보유하는 것과 같은 생성 작업 내에서 처리하는 것입니다.


이것은 Railscast 에피소드 38 에서 다루었습니다 . params해시를 사용하여 클릭 된 버튼을 감지하는 것이 올바른 방법입니다.

전망:

<%= submit_tag 'Create' %>
<%= submit_tag 'Create and Add Another', name: 'create_and_add' %>

제어 장치:

if params[:create_and_add]
  # Redirect to new form, for example.

else
  # Redirect to show the newly created record, for example.
end

레일에서 고급 제약사용하여 해결했습니다 .

아이디어는 동일한 경로 (따라서 동일한 이름의 경로 및 작업)를 가지지 만 제약 조건이 다른 작업으로 라우팅되는 것입니다.

resources :plan do
  post :save, constraints: CommitParamRouting.new("Propose"), action: :propose
  post :save, constraints: CommitParamRouting.new("Finalize"), action: :finalize
end

CommitParamRoutingmatches?커밋 매개 변수가 주어진 인스턴스 attr과 일치하면 true를 반환 하는 메서드가있는 간단한 클래스입니다 . 값.

이것은 gem commit_param_matching 으로 사용할 수 있습니다 .


다음 과 같이 form_for 도우미 에서 수행 할 수도 있습니다.

 <%= f.submit "Publish",name: "publish", class: "tiny button radius success" %>
 <%= f.submit 'Mark as Draft', name: "draft", class: "tiny button radius " %>

로직은 컨트롤러에서 동일합니다.

   if params[:publish]
      // your code
   elsif params[:draft]
      // your code
   end

이 문제를 한 번 만난 것이 기억납니다. 두 개의 버튼을 유지 한 다음 params [: commit]을 기반으로 일부 작업을 호출 할 수 없습니다. 제출 버튼 onclick은 양식이 참조하는 URL을 호출합니다. 원하는 동작을 얻기위한 특정 나쁜 방법이 있습니다. 폼이 참조하는 액션을 호출하는 버튼을 유지하고 액션을 호출 할 다른 버튼을 얻으려면 link_to를 사용한 다음 버튼과 일치하도록 스타일을 변경했습니다. 또한 jQuery를 사용하여 양식이 호출하는 URL을 변경하여 런타임에 호출되는 작업을 결정할 수 있습니다. 도움이 되었기를 바랍니다.


You could also set some data attributes on the submit buttons and use JavaScript to change out the form action on click of one of the buttons


usually i using the suggestion given by John Topley (see answer above). another way is using JQuery /JS changing the form action attribute- upon clicking the submit button example:

form_tag({} ,:method => 'post', :id => 'reports_action') do 
   .......
   ....... 
  submit_tag 'submit',  :onclick => "return changeAction();"
end

and then .....

function changeAction(){
   $('#reports_action').attr('action','my_new_action');
}   

참고URL : https://stackoverflow.com/questions/3332449/rails-multi-submit-buttons-in-one-form

반응형