복붙노트

[RUBY-ON-RAILS] 레일 : 하나의 폼에 버튼을 멀티 제출

RUBY-ON-RAILS

레일 : 하나의 폼에 버튼을 멀티 제출

내가 제 모델을 가지고 있고, 문서에 '새로운'나 '게시'및 '임시 보관함에 저장 "두 개의 버튼을 볼 수 말해봐.

내 질문은 내가 컨트롤러에서 클릭하는 버튼을 알 수있는 방법이다.

이미 해결책을 가지고 있지만 더 나은 방법이있을 것 같아요. 내가 현재 뷰에 사용하는 것입니다 :

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

해당 작업을 처리하기 위해 문자열 : [커밋] 그래서 컨트롤러, 나는 PARAMS를 사용할 수 있습니다.

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

  @article.save
end

그러나 나는보기와 관련된 문자열을 사용하는 것은 좋지 않다라고 생각합니다. 당신은 나에게이 작업을 수행하는 또 다른 방법을 알 수 있을까요?

업데이트 :이 버튼은 같은 형태이기 때문에, 그들은 모두 '만들기'활동에 가고, 그리고 나를 위해의 확인을하는 것입니다. 내가 원하는 것은 조치를 만들 내에서, 그러한 같은 조 모델에 '상태'열을 포기하고 '공개'또는 '초안'을 보유하고 있음을 처리하는 것입니다.

해결법

  1. ==============================

    1.이 클릭 올바른 방법입니다 된 버튼을 검출하기 위해 PARAMS 해시를 사용 Railscast 에피소드 38에 포함되었다 :

    이 클릭 올바른 방법입니다 된 버튼을 검출하기 위해 PARAMS 해시를 사용 Railscast 에피소드 38에 포함되었다 :

    전망:

    <%= 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
    
  2. ==============================

    2.우리는 레일에 고급 제약 조건을 사용하여 해결했다.

    우리는 레일에 고급 제약 조건을 사용하여 해결했다.

    아이디어는 동일한 경로 (따라서 같은 이름의 경로 및 행동)하지만 다른 작업에 라우팅 제약하는 것입니다.

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

    방법의 일치를 가지고 간단한 클래스입니다 CommitParamRouting? 이는이 PARAM 지정된 인스턴스 ATTR 일치 위탁하는 경우 true를 반환합니다. 값.

    보석의 commit_param_matching 등이 가능합니다.

  3. ==============================

    3.그것은 또한이 같은 form_for 헬퍼에 수행 할 수 있습니다

    그것은 또한이 같은 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
    
  4. ==============================

    4.나는 한 번이 문제를 통해 오는 기억한다. 당신은 PARAMS에 따라 일부 조치를 두 개의 버튼을 유지하고 호출 할 수 없습니다 [: 커밋]. 는 버튼의 onclick 양식을 참조하는 URL을 호출하는 것입니다 제출합니다. 원하는 동작을 얻기 위해 어떤 나쁜의 방법이 있습니다. 양식을 참조하는 조치를 호출하고 액션을 호출하는 또 다른 버튼을 얻을 수있는 버튼을 계속, 나는 버튼을 일치하도록 변경 한 후 스타일을 LINK_TO을 사용합니다. 또한, 또는 당신은 따라서 조치가 실행시에 호출되는 것을 결정, 양식을 부를 것이다 URL을 변경하는 jQuery를 사용할 수 있습니다. 도움이 되었기를 바랍니다.

    나는 한 번이 문제를 통해 오는 기억한다. 당신은 PARAMS에 따라 일부 조치를 두 개의 버튼을 유지하고 호출 할 수 없습니다 [: 커밋]. 는 버튼의 onclick 양식을 참조하는 URL을 호출하는 것입니다 제출합니다. 원하는 동작을 얻기 위해 어떤 나쁜의 방법이 있습니다. 양식을 참조하는 조치를 호출하고 액션을 호출하는 또 다른 버튼을 얻을 수있는 버튼을 계속, 나는 버튼을 일치하도록 변경 한 후 스타일을 LINK_TO을 사용합니다. 또한, 또는 당신은 따라서 조치가 실행시에 호출되는 것을 결정, 양식을 부를 것이다 URL을 변경하는 jQuery를 사용할 수 있습니다. 도움이 되었기를 바랍니다.

  5. ==============================

    5.또한 제출 버튼을 일부 데이터 속성을 설정하고 버튼 중 하나를 클릭의 양식 동작을 변경 자바 스크립트를 사용할 수

    또한 제출 버튼을 일부 데이터 속성을 설정하고 버튼 중 하나를 클릭의 양식 동작을 변경 자바 스크립트를 사용할 수

  6. ==============================

    6.일반적으로 내가 존 Topley에 의해 주어진 제안을 사용하여 (위의 답 참조). 또 다른 방법은 JS시 클릭 형태 액션 attribute- 변경 / jQuery를 사용하는 버튼을 제출 예:

    일반적으로 내가 존 Topley에 의해 주어진 제안을 사용하여 (위의 답 참조). 또 다른 방법은 JS시 클릭 형태 액션 attribute- 변경 / jQuery를 사용하는 버튼을 제출 예:

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

    그리고 .....

    function changeAction(){
       $('#reports_action').attr('action','my_new_action');
    }   
    
  7. from https://stackoverflow.com/questions/3332449/rails-multi-submit-buttons-in-one-form by cc-by-sa and MIT license