2016-08-09 1 views
1

Так что я получил эти взгляды:DRY контроллер .valid? для создания и обновления с помощью simple_form

new.html.erb

<div class="booyah-box col-xs-10 col-xs-offset-1"> 
<h1>Expose Your Hidden Gem</h1> 
<%= simple_form_for @place do |f| %> 

<%= f.input :name, error: "Name is mandatory" %> 
<%= f.input :address %> 
<%= f.input :description %> 
<br /> 
<%= f.submit 'Create', class: 'btn btn-primary' %> 
<% end %> 
</div> 

edit.html.erb

<div class="booyah-box col-xs-10 col-xs-offset-1"> 
<h1>Edit Your Place</h1> 
<%= simple_form_for @place do |f| %> 
<%= f.input :name %> 
<%= f.input :address %> 
<%= f.input :description %> 
<br /> 
<%= f.submit 'Update', class: 'btn btn-primary' %> 
<% end %> 
</div> 

эта модель: Место. rb

class Place < ActiveRecord::Base 
belongs_to :user 
has_many :comments, dependent: :destroy 
has_many :photos 
geocoded_by :address 
after_validation :geocode 

validates :name, presence: true 
validates :address, presence: true 
validates :description, presence: true 
end 

И, наконец, places_controller.rb (Показывая только создание и обновление)

def create 
    @place = current_user.places.create(place_params) 
    if @place.save 
    redirect_to root_path 
    else 
    render :new 
    end 
    end 

def update 
@place = Place.find(params[:id]) 
if @place.user != current_user 
return render text: 'Not Allowed', status: :forbidden 
end 
@place.update_attributes(place_params) 
if @place.save 
    redirect_to root_path 
else 
    render :edit 
end 
end 

Но я стараюсь думать DRY и хочу знать, если есть лучший способ, чтобы сделать проверку на имя адрес и наличие описания, не имея такой же идентичный код как создавать и обновлять части моего контроллера? Я чувствую, что я просто должен писать его один раз ...

ответ

0

Во-первых, вы можете реорганизовывать свои взгляды использовать следующую структуру:

# new.html.erb 
<div class="booyah-box col-xs-10 col-xs-offset-1"> 
    <h1>Expose Your Hidden Gem</h1> 
    <%= render 'form' %> 
</div> 

# edit.html.erb 
<div class="booyah-box col-xs-10 col-xs-offset-1"> 
    <h1>Edit Your Place</h1> 
    <%= render 'form' %> 
</div> 

# _form.html.erb 
<%= simple_form_for @place do |f| %> 
    <%= f.input :name %> 
    <%= f.input :address %> 
    <%= f.input :description %> 
    <br /> 
    <% submit_label = @place.new_record? ? 'Create' : 'Update' %> 
    <%= f.submit submit_label, class: 'btn btn-primary' %> 
<% end %> 

, а затем в контроллерах можно реорганизовать, чтобы:

def create 
    @place = current_user.places.new(place_params) 
    if @place.save 
    redirect_to root_path 
    else 
    render :new 
    end 
end 

def update 
    @place = current_user.places.find(params[:id]) 
    @place.attributes = place_params 
    if @place.save 
    redirect_to root_path 
    else 
    render :edit 
    end 
end 
Смежные вопросы