2016-06-27 3 views
0

Я хотел бы обновить данные без формы.Rails: обновить данные через link_to (без представления)

Хотя есть похожие вопросы, они не работают для меня.

Update field through link_to in Rails

link_to update (without form)

То, что я хотел бы сделать, это удалить данные, как следующие;

Например, удалите name и address при удалении ссылки.

id | name | address | ... 
12 | aaa | bbb  | ... 

в

id | name | address | ... 
12 |  |   | ... 

Хотя я попробовал некоторые, была показана ошибка. (Например ActionController::RoutingError)

схема

create_table "rooms", force: :cascade do |t| 
    t.string "name" 
    t.text  "address" 
    ... 

модель

schedule.rb

class Schedule < ActiveRecord::Base 
    belongs_to :user 
    has_many :rooms, inverse_of: :schedule, dependent: :destroy 
    accepts_nested_attributes_for :rooms, allow_destroy: true 
    ... 

room.rb

class Room < ActiveRecord::Base 
    belongs_to :schedule, inverse_of: :rooms 
    default_scope -> { order(day: :asc) } 
    ... 

вид

Я хотел бы добавить ссылку в schedules/_schedule.html.erb Он имеет следующее;

... 
    <% schedule.rooms.each do |room| %> 
    ... 
    <% if room.name.present? %> 
     <%= link_to "Delete", rooms_path(room, room:{address: nil}) , method: :put, data: { confirm: "You sure?"} %> 
    ... 

Я также попробовал другой код, как показано ниже, но они не работают.

<%= link_to "Delete", rooms_path(room:{address: nil}) , method: :put, data: { confirm: "You sure?"} %> 

    <%= link_to "Delete", rooms_path(room) , method: :put, params: {address: nil}, data: { confirm: "You sure?"} %> 

и так далее.

routes.rb

... 
    resources :schedules do 
    resources :events 
    end 

    resources :schedules do 
    resources :rooms 
    end 

    resources :rooms do 
    resources :events 
    end 
... 

rooms_controller.rb

... 

def edit 
    #nothing 
end 

def update 
    @room = Room.find(params[:id]) 
    if @room.update(room_params) 
    flash[:success] = "Room updated!" 
    redirect_to itinerary_path(@room.itinerary) || current_user 
    else 
    render 'edit' 
    end 
end 

def destroy 
    @room = Room.find(params[:id]) 
    @room.destroy 
    flash[:success] = "Room deleted" 
    redirect_to schedule_path(@room.schedule) || current_user 
end 

private 

    def room_params 
    params.require(:room).permit(
     :id, :_destroy, :name, :address, :schedule_id, :day) 
    end 

... 

Было бы понятно, если бы вы могли дать мне какие-либо предложения.

+0

разместить свои маршруты .. –

+0

Спасибо за быстрый ответ, @Gokul М.Я добавляю маршруты в нижней части моего вопроса. – SamuraiBlue

ответ

2

Вам необходимо изменить rooms_path на room_path.

Без Params:

<%= link_to "Delete", room_path(room) , method: :put, data: { confirm: "You sure?"} %> 

С Params:

<%= link_to "Delete", room_path(room, room: {name: nil, address: nil}) , method: :put, data: { confirm: "You sure?"} %> 
+0

Спасибо за ваш ответ, @Gokul M. Хотя я пробовал ваш код, отображается другая ошибка. 'ActionController :: ParameterMissing (параметр отсутствует или значение пусто: room):'. – SamuraiBlue

+0

@SamuraiBlue Я изменил свой ответ, вы можете просто передать 'room' в' room_path' –

+0

@SamuraiBlue Я включил параметры в link_to, пожалуйста, проверьте его. –

Смежные вопросы